watchos 開発ことはじめ€¦ · ・ライフログをサーバに送るアプリ ・ios...

18
AKIBA.SWIFT #5 ketancho watchOS 開発ことはじめ ~ハッカソンで初めて watchOS 開発した話~

Upload: others

Post on 06-Jul-2020

4 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: watchOS 開発ことはじめ€¦ · ・ライフログをサーバに送るアプリ ・iOS 経由で API を呼び出し、 DBにライフログを格納 ・環境 ・watchOS 2.2.1

A K I B A . S W I F T # 5

@ketancho

watchOS 開発ことはじめ ~ハッカソンで初めてwatchOS開発した話~

Page 2: watchOS 開発ことはじめ€¦ · ・ライフログをサーバに送るアプリ ・iOS 経由で API を呼び出し、 DBにライフログを格納 ・環境 ・watchOS 2.2.1

自己紹介📛 @ketancho

👔 某SIer   Web -> AWS -> ネイティブアプリ

🖥 開発歴   AWS:2~3年   iOS歴:10ヶ月🔰   watchOS歴:2日間🔰🔰   ↑恐れ多いのですが、今日はこの話をします!

💟 👶🔪🍛⚽

Page 3: watchOS 開発ことはじめ€¦ · ・ライフログをサーバに送るアプリ ・iOS 経由で API を呼び出し、 DBにライフログを格納 ・環境 ・watchOS 2.2.1

* watchOS アプリを開発したことある方?

Page 4: watchOS 開発ことはじめ€¦ · ・ライフログをサーバに送るアプリ ・iOS 経由で API を呼び出し、 DBにライフログを格納 ・環境 ・watchOS 2.2.1

今日お話しすること・watchOS 開発したことがない方向けに、  開発の一連の流れを紹介したいです。

・事前に資料を上げているので、  手元の Xcode で操作をしながら聞いていただいても  よいかと思います。

Page 5: watchOS 開発ことはじめ€¦ · ・ライフログをサーバに送るアプリ ・iOS 経由で API を呼び出し、 DBにライフログを格納 ・環境 ・watchOS 2.2.1

作ったもの・ライフログをサーバに送るアプリ

・iOS 経由で API を呼び出し、  DBにライフログを格納

・環境  ・watchOS 2.2.1 / iOS 9.3.1  ・XCode 7.3.1 / Swift 2.2

😕 というと聞こえはいいのですが、 結局は iPhone でできることを Watch で行えるようにしただけ.. Watch ならではのアプリを作りたい。

Page 6: watchOS 開発ことはじめ€¦ · ・ライフログをサーバに送るアプリ ・iOS 経由で API を呼び出し、 DBにライフログを格納 ・環境 ・watchOS 2.2.1

基本のキ・watchOS アプリは iOS アプリとセットで動作する

・iPhone 側にアプリを実機インストールすると、  AppleWatch 側にもアプリがインストールされる

はじめ方・iOSアプリプロジェクトを作成

・File > New > Target..   > watchOS > Application > WatchKit App

Page 7: watchOS 開発ことはじめ€¦ · ・ライフログをサーバに送るアプリ ・iOS 経由で API を呼び出し、 DBにライフログを格納 ・環境 ・watchOS 2.2.1

画面の種類・InterfaceController   メイン画面。   iOSとは違い、制約をつけてupdateして、という流れはなし

・Notification   iPhone 側に通知が来たタイミングで、Watch 側にも通知

・Glances   アプリのサマリ画面   アプリの操作はできない

・Complications   時間に合わせて時計の文字盤に   情報を表示

Page 8: watchOS 開発ことはじめ€¦ · ・ライフログをサーバに送るアプリ ・iOS 経由で API を呼び出し、 DBにライフログを格納 ・環境 ・watchOS 2.2.1

.swift各画面の動きを実装 *ViewController.swift に相当

アプリ起動時の動きを記述 AppDelegate.swift に相当

Notification画面の実装

Glance画面の実装

Complications画面の実装

Page 9: watchOS 開発ことはじめ€¦ · ・ライフログをサーバに送るアプリ ・iOS 経由で API を呼び出し、 DBにライフログを格納 ・環境 ・watchOS 2.2.1

通信・Watch Connectivity Framework

 ・Background transfers    データをキューに入れて送信。タイミングはOS次第   ・User Info Transfer(キューに入れたもの全てを送信)   ・Application Context(キューの中の最新のものを送信)   ・File Transfer

 ・Interactive messaging ← 今回はこちらを使用    名前の通り、即時のデータ連携に使用。

Page 10: watchOS 開発ことはじめ€¦ · ・ライフログをサーバに送るアプリ ・iOS 経由で API を呼び出し、 DBにライフログを格納 ・環境 ・watchOS 2.2.1

Interactive messaging1) 送信側  ・import WatchConnectivity

 ・class DrugInterfaceController: WKInterfaceController, WCSessionDelegate {

 ・override func willActivate() { super.willActivate() if (WCSession.isSupported()) { session = WCSession.defaultSession() session.delegate = self session.activateSession() } }

Page 11: watchOS 開発ことはじめ€¦ · ・ライフログをサーバに送るアプリ ・iOS 経由で API を呼び出し、 DBにライフログを格納 ・環境 ・watchOS 2.2.1

Interactive messaging1) 送信側(続き)  ・let applicationData = ["targetPage": "xxx", "action": "xxx"] session.sendMessage(applicationData, replyHandler: {(_: [String : AnyObject]) -> Void in}, // 正常処理 errorHandler: {(error ) -> Void in // 異常処理 })

😕 引数は、  ・iOS側のどのページに  ・どのアクションをしてほしいか を記載しました。ベストプラクティスを知りたい..

Page 12: watchOS 開発ことはじめ€¦ · ・ライフログをサーバに送るアプリ ・iOS 経由で API を呼び出し、 DBにライフログを格納 ・環境 ・watchOS 2.2.1

Interactive messaging2) 受信側  ・import WatchConnectivity

 ・class DrugInterfaceController: WKInterfaceController, WCSessionDelegate {

 ・override func willActivate() { super.willActivate() if (WCSession.isSupported()) { session = WCSession.defaultSession() session.delegate = self session.activateSession() } }

Page 13: watchOS 開発ことはじめ€¦ · ・ライフログをサーバに送るアプリ ・iOS 経由で API を呼び出し、 DBにライフログを格納 ・環境 ・watchOS 2.2.1

画面の種類2) 受信側(続き) ・func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) { let targetPage = message["targetPage"] as? String let action = message["action"] as? String dispatch_async(dispatch_get_main_queue()) { if targetPage == “xxx” && action == “xxx” { self.finishDance() } } }

Page 14: watchOS 開発ことはじめ€¦ · ・ライフログをサーバに送るアプリ ・iOS 経由で API を呼び出し、 DBにライフログを格納 ・環境 ・watchOS 2.2.1

心拍数1) iOS, watchOS ともに HealthKit を許可

2) watchOS 側 ・import HealthKit let healthStore = HKHealthStore() let heartRateType = HKQuantityType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeartRate)! let heartRateUnit = HKUnit(fromString: “count/min”) var heartRateQuery: HKQuery?

Page 15: watchOS 開発ことはじめ€¦ · ・ライフログをサーバに送るアプリ ・iOS 経由で API を呼び出し、 DBにライフログを格納 ・環境 ・watchOS 2.2.1

心拍数2) watchOS 側(続き) ・guard HKHealthStore.isHealthDataAvailable() else { self.HRLabel.setText("not available") return } let dataTypes = Set([heartRateType]) healthStore.requestAuthorizationToShareTypes(nil, readTypes: dataTypes) { (success, error) -> Void in guard success else { self.HRLabel.setText("not allowed”) return }

Page 16: watchOS 開発ことはじめ€¦ · ・ライフログをサーバに送るアプリ ・iOS 経由で API を呼び出し、 DBにライフログを格納 ・環境 ・watchOS 2.2.1

心拍数2) watchOS 側(続き) ・if heartRateQuery == nil { // start heartRateQuery = self.createStreamingQuery() healthStore.executeQuery(self.heartRateQuery!) } else { // stop healthStore.stopQuery(self.heartRateQuery!) heartRateQuery = nil }

Page 17: watchOS 開発ことはじめ€¦ · ・ライフログをサーバに送るアプリ ・iOS 経由で API を呼び出し、 DBにライフログを格納 ・環境 ・watchOS 2.2.1

辛かったこと😑・最初は swift3.0 で挑戦しようと思ったのですが、  2.2との差分が大きく、調査も難しいと思い断念

・AppleWatch へのアプリ実機インストールが結構時間が..

・Provisioning Profile が3つ作られる?  -> Apple Developer Program に登録していなかったので、   7日間で10Provisioning Profile の上限に引っかかった?

Page 18: watchOS 開発ことはじめ€¦ · ・ライフログをサーバに送るアプリ ・iOS 経由で API を呼び出し、 DBにライフログを格納 ・環境 ・watchOS 2.2.1

今後やりたいこと💡・新しい UX を生むような watchOS アプリを考えたい  (ただのリモコン役ではなく)