watchos 開発ことはじめ€¦ · ・ライフログをサーバに送るアプリ ・ios...
Post on 06-Jul-2020
7 Views
Preview:
TRANSCRIPT
A K I B A . S W I F T # 5
@ketancho
watchOS 開発ことはじめ ~ハッカソンで初めてwatchOS開発した話~
自己紹介📛 @ketancho
👔 某SIer Web -> AWS -> ネイティブアプリ
🖥 開発歴 AWS:2~3年 iOS歴:10ヶ月🔰 watchOS歴:2日間🔰🔰 ↑恐れ多いのですが、今日はこの話をします!
💟 👶🔪🍛⚽
* watchOS アプリを開発したことある方?
今日お話しすること・watchOS 開発したことがない方向けに、 開発の一連の流れを紹介したいです。
・事前に資料を上げているので、 手元の Xcode で操作をしながら聞いていただいても よいかと思います。
作ったもの・ライフログをサーバに送るアプリ
・iOS 経由で API を呼び出し、 DBにライフログを格納
・環境 ・watchOS 2.2.1 / iOS 9.3.1 ・XCode 7.3.1 / Swift 2.2
😕 というと聞こえはいいのですが、 結局は iPhone でできることを Watch で行えるようにしただけ.. Watch ならではのアプリを作りたい。
基本のキ・watchOS アプリは iOS アプリとセットで動作する
・iPhone 側にアプリを実機インストールすると、 AppleWatch 側にもアプリがインストールされる
はじめ方・iOSアプリプロジェクトを作成
・File > New > Target.. > watchOS > Application > WatchKit App
画面の種類・InterfaceController メイン画面。 iOSとは違い、制約をつけてupdateして、という流れはなし
・Notification iPhone 側に通知が来たタイミングで、Watch 側にも通知
・Glances アプリのサマリ画面 アプリの操作はできない
・Complications 時間に合わせて時計の文字盤に 情報を表示
.swift各画面の動きを実装 *ViewController.swift に相当
アプリ起動時の動きを記述 AppDelegate.swift に相当
Notification画面の実装
Glance画面の実装
Complications画面の実装
通信・Watch Connectivity Framework
・Background transfers データをキューに入れて送信。タイミングはOS次第 ・User Info Transfer(キューに入れたもの全てを送信) ・Application Context(キューの中の最新のものを送信) ・File Transfer
・Interactive messaging ← 今回はこちらを使用 名前の通り、即時のデータ連携に使用。
Interactive messaging1) 送信側 ・import WatchConnectivity
・class DrugInterfaceController: WKInterfaceController, WCSessionDelegate {
・override func willActivate() { super.willActivate() if (WCSession.isSupported()) { session = WCSession.defaultSession() session.delegate = self session.activateSession() } }
Interactive messaging1) 送信側(続き) ・let applicationData = ["targetPage": "xxx", "action": "xxx"] session.sendMessage(applicationData, replyHandler: {(_: [String : AnyObject]) -> Void in}, // 正常処理 errorHandler: {(error ) -> Void in // 異常処理 })
😕 引数は、 ・iOS側のどのページに ・どのアクションをしてほしいか を記載しました。ベストプラクティスを知りたい..
Interactive messaging2) 受信側 ・import WatchConnectivity
・class DrugInterfaceController: WKInterfaceController, WCSessionDelegate {
・override func willActivate() { super.willActivate() if (WCSession.isSupported()) { session = WCSession.defaultSession() session.delegate = self session.activateSession() } }
画面の種類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() } } }
心拍数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?
心拍数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 }
心拍数2) watchOS 側(続き) ・if heartRateQuery == nil { // start heartRateQuery = self.createStreamingQuery() healthStore.executeQuery(self.heartRateQuery!) } else { // stop healthStore.stopQuery(self.heartRateQuery!) heartRateQuery = nil }
辛かったこと😑・最初は swift3.0 で挑戦しようと思ったのですが、 2.2との差分が大きく、調査も難しいと思い断念
・AppleWatch へのアプリ実機インストールが結構時間が..
・Provisioning Profile が3つ作られる? -> Apple Developer Program に登録していなかったので、 7日間で10Provisioning Profile の上限に引っかかった?
今後やりたいこと💡・新しい UX を生むような watchOS アプリを考えたい (ただのリモコン役ではなく)
top related