Apple Watch Programming Guide まとめ
Apple Watch Programming Guide: Developing for Apple Watch
2015-03-09 初出バージョンのドキュメントまとめ(網羅ではなく適宜省略)
Overview
Developing for Apple Watch
Apple Watch and Its Paired iPhone
- 3rd party アプリを動かすには iPhone が必要
- WatchKit App は Apple Watch上で動き、WatchKit Extension は iPhone上で動く
- WatchKit App には Storyboard とリソース画像のみが含まれる
Glance Interfaces
グランス
- アプリの重要な情報を表示する
- スクリーンにフィットするスクロール不可なインターフェース
- read-only な画面でボタン、スイッチなど操作可能なコントロールを含まない
- グランスをタップすると WatchKit App が起動する
- グランスを作るのに個別の実行ファイルを作成する必要はない(WatchKit App の一部として実装する)
Custom Interfaces for Local and Remote Notifications
ローカル通知とリモート通知のカスタムUI
- iOS 8のアクション可能な通知を提供
- iOSアプリ側で対応すれば Apple Watch側には自動でアクションボタンが表示される
- 選択されたアクションは WatchKit App側でハンドリングする
Configuring Your Xcode Project
プロジェクトの設定方法について
- 既存のiOSアプリのプロジェクトに WatchKit App のターゲットを追加する
Adding a WatchKit App to Your iOS Project
iOSプロジェクトへの WatchKit App の追加
- カスタムの通知インターフェースを実装する予定がなくても
Include Notification Scene
のチェックボックスをオンにするのが推奨 - バンドルIDは既存のiOSアプリのバンドルIDから自動で設定される。iOSアプリのバンドルIDを変更する場合は WatchKit App と WatchKit Extensnion のバンドルIDも変更する必要がある
App Target Structure
ターゲットの構成
- WatchKit App のターゲットを追加するとWatchKit Extension と WatchKit App の2つの実行ファイルが作成されてプロジェクトのビルドの依存設定 build dependencies が更新される
- iOSアプリに WatchKit Extension が含まれ、WatchKit Extension に WatchKit App が含まれる構成になる
The Build, Run, and Debug Process
Build, Run, Debug のプロセス
- WatchKit App のターゲットを作成すると run と debug のスキームが自動で設定される
- グランスやカスタム通知UIを利用する場合、それらのテストのためにスキームを設定する必要がある(ターゲット作成時にグランスとカスタム通知UIのチェックボックスをオンにするとスキームの設定も自動でおこなってくれる)
Specifying a Notification Payload for Testing
通知のテスト方法について
- カスタム通知UIのテストに JSON payload を指定できる
- 拡張子 .apns のファイルをスキームの設定画面で設定する
WatchKit Simulator Actions
キーは辞書の配列を持つ- title - アクションボタンのタイトルでこのキーは必須
- identifier -
application:handleActionWithIdentifier:forLocalNotification:completionHandler:
かapplication:handleActionWithIdentifier:forRemoteNotification:completionHandler:
メソッドに渡される、このキーは必須 - destructive - 1か0を設定する。1なら destructive なボタンとして表示される。このキーはオプション
WatchKit App Architecture
Managing Scenes: The Interface Controller
シーンの管理
WKInterfaceController
によってシーンが管理されるUIViewController
と違って、インターフェース内の View を実際には管理しない- グランスとカスタム通知UIはアプリの他の Interface Controller とは独立した特殊な Interface Controller を使う(Storyboard のソースコード内では
glanceController
notificationController
という特別なXMLのエレメントが与えられている)
WatchKit App Life Cycle
WatchKit App のライフサイクル
init
awakeWithContext:
メソッドでデータを読み込みインターフェースに値を設定する。willActive
で初期化しないwillActive
は直前の変更を行うのに使用する。例えば Interface が表示されている間のアニメーションを開始したり、タスクを開始したりする- ユーザ操作をアクションメソッドでハンドリングする。その他のタイミングでのアクションは
NSTimer
を使う - グランスはアクションメソッドには対応していない。グランスでタップした時はアプリが起動する
- 長いタスクを実行しない
- ユーザがアプリを終了したり Apple Watch の操作を停止すると iOS は現在の Interface Controller を deactivate する
Tasks to Perform at Different Stages of an App’s Life
Method | Tasks to perform |
---|---|
init | Interface Controller を初期化する最初のタイミング |
awakeWithContext: | データを読み込んでラベル、画像、テーブル等を設定する。新しい Interface Controller へデータを渡すのにも使用する |
willActivate | ラベルの更新等小さな変更を行う。初期化のほとんどは init と awakeWithContext: で行う |
didDeactivate | Interface をクリーンアップして静止状態にする。タイマーやアニメーションの停止等を行う。このメソッドでは Interface への値の設定はできない。再び willActivate が呼ばれるまで Interface への値の設定はできない |
Debugging Your Activation Code in iOS Simulator
シミュレータでのテスト
- シミュレータのロックとアンロックで
willActivate
とdidDeactivate
をテストできる
Sharing Data with Your Containing iOS App
親アプリとのデータの共有について
- shared app group を使ってiOSアプリと WatchKit Extension間でファイルや UserDefaults などのデータを共有できる
- App Groups を有効にしてそれぞれのターゲットの entitlements に
com.apple.security.application-groups
を設定する - コードからは shared container directory を介してファイルを共有できる。
NSFilemanager
のcontainerURLForSecurityApplicationGroupIdentifier:
メソッドを使う - 設定を共有するには
NSUserDefaults
のinitWithSuiteName:
メソッドを使う
Communicating Directly with Your Containing iOS App
親アプリとのダイレクトな通信について
openParentApplication:reply:
でアプリと連携する- WatchKit Extension はバックグラウンドでの動作をサポートしていない
- 処理に時間がかかるものはiOSアプリで実行して WatchKit Extension へ通信を行う
openParentApplication:reply:
はアプリを起動してapplication:handleWatchKitExtensionRequest:reply:
delegateメソッドを呼ぶ。そして提供された dictionary を使ってアプリから WatchKit Extension へ reply を返す
Leveraging iOS Technologies
iOSの技術の活用
- 位置情報等いくつかの機能はユーザの iPhone で許可されていなければならない事に気をつける
- WatchKit で利用しようとした際に iPhone側に prompt が表示される
- バックグラウンドでの実行をしない事
- 長い処理を行わない事。長い処理はiOSアプリにさせる。例えば位置情報の取得は WatchKit Extension で行わずアプリ側で行う
Handoff Support
ハンドオフ対応
WKInterfaceController
のupdateUserActivity:userInfo:webpageURL:
メソッドを使う- グランス以外では他のデバイスで作成されたアクティビティをハンドリングしない。グランスではメインのアプリで利用できる情報を特定するアクティビティの dicationary を使用する事ができる
Remote Control Events and Now Playing Information
リモート再生とNow Playing
- iPhone上のオーディオとビデオの再生コントロールが可能
- Now Playing グランスはアプリの remote control event を生成する
- アプリは
MPRemoteCommandCenter
のコマンドを登録してイベントを自動的に受け取る - Apple Watchは
MPFeedbackCommand
のlocalizedTitle
の代わりにlocalizedShortTitle
を用いる - Now Playing グランスはiOSアプリで現在再生されている情報を自動的に表示する。アプリでは
MPNowPlayingInfoCenter
を使用してこの情報を提供する
続く