Apple Watch WatchKitまとめ

Apple Watch待ち遠しいですね!iPhoneをメインに使っているけれど、Android Wareが使いたいという理由でAndroidとiPhone両方とも持ち歩いている筆者にとってはApple Watchが早く発売されて欲しいと切望しているわけです。そうすればAndroid Wareを投げ捨てすぐさまWatchに乗り換えるよ。

さてさて今日はAppleWatchです。AppleのデベロッパーサイトでNDA無しに閲覧出来る情報を元に解説したいと思います。

WatchKitに関する情報は下記のサイトから得られます。当然英語ですが。

https://developer.apple.com/watchkit/

では内容を見ていきましょう!


 

WatchKitアプリを作る

WatchKitアプリは、iPhoneで操作するWatchKitエクステンションと、Apple Watchにインストールされる一連のUIの2つのパーツで構成されます。

Apple Watchでアプリを起動すると、iPhone上のWatchKitエクステンションはUIを更新しユーザー操作に反応するため、バックグラウンドで実行されます。

WatchKitはiPhoneを拡張するための3つの機能(WatchKitアプリ・一見性=ぱっと見でわかること・実行可能な通知)を提供します。

apps
https://developer.apple.com/watchkit/

WatchKitアプリ

Apple Watch上のアプリは完全なUIを含んでいます。ユーザーはApple Watchに固有な方法で起動、制御、対話することができます。

Glance(一見性:チラッと見て理解できること)

glances
https://developer.apple.com/watchkit/

一見するだけで、ユーザーがタイムリーに気になる情報を読み取ることを可能にします。

notifications
https://developer.apple.com/watchkit/

アクション可能なNotification

WatchKitのアクション可能な通知は、ユーザーが手首から適切なアクションができるようように構築・デザインされました。

 

 

 デザインガイドとテンプレート

WatchKitアプリ・Glance・Notificationを作成する助けになる網羅的なデザインリソースを入手してください。

Apple Watch Design Resources
※ダウンロードにはApple Developerログインが必要。

Xcode 6.2 beta, including iOS 8.2 SDK with WatchKit
はい、https://developer.apple.com/watchkit/には、Xcodeの最新版βへのリンクが貼ってあります。Developerならここからダウンロード、インストールしましょう。6.2betaからWatchKitが含まれていますが、今回は最新の6.3betaをダウンロード、インストールします。

WatchKit Programming Guide
WatchKitのプログラミングガイドです。こちらもDeveloperログイン不要の公開情報になっています。

Apple Watch Human Interface Guidelines
こちらはログイン不要の公開情報です。

Apple Watchは次のテーマを体現する。

Personal:Apple Watchは身につけるためにデザインされてるので、そのUIは着用者の存在に調和している。腕をあげ時間と新着アラートをみる。デジタルタッチ(特にハートビートとSketch機能)はとてもパーソナルな新しいタイプのコミュニケーションを可能にする。加速度センサーと心拍数センサーはパーソナライズされた着用者の日常の活動情報を提供する。他のApple端末は着用者と常につながっているわけではなかった。この接続に留意することがApple Watchのアプリデザインにおいて重要です。

Holistic(全体):Apple Watchはモノとソフトの境界があいまいになるように設計された。Digital Crown(つまみの事)は微妙なソフトウェアナビゲーションを細かく制御可能なハードウェアだ。Tapicエンジン(?)は微妙な、アラートと画面上の操作に結びついた物理フィードバックを生み出す。Forceタッチ(ハードウェアに理解される物理ジェスチャー)前後関係を鑑みたソフトウェアによる制御の新しい次元を示す。さらに物理境界としてはRetinaディスプレイが採用されており、UIデザインの境界が見えないように効果的に表示することができる。気の利いたアプリデザインでハードウェアとソフトウェアが見分けのつかない感じの体験を与えるべきです。

Lightweight(軽量):Apple Watchのアプリは、表示サイズと手首の位置を最大限に活用し、すばやく、軽量な操作方法としてデザインされている。プライバシーとユーザビリティの両方のために情報はすばやく簡単にアクセス可能または非表示可能である。通知は短時間見ればよく、例えば、最小限のアラートを提供するが、もし着用者が関与している場合のみより多くの情報を表示するように設計されている。Glanceはスワイプ可能なインタフェースでアプリからの情報に簡単にアクセスできる。Apple Watch用アプリは着用者のおかれる状況を尊重する必要がある。小さなディスプレイで、頻繁に、チラッと見る。

WatchKit アプリはiOSアプリを補完する。iOSアプリにとって変わるものではない。もしあなたのアプリの操作が数分ならば、WatchKitアプリ操作は秒単位で操作できると期待される。だから、操作は短く、インタフェースは簡潔であるべきだ。

 

サンプルコード

サンプルコードも一般に入手可能な状態で公開されています。ここからダウンロードができます。

https://developer.apple.com/library/prerelease/ios/samplecode/WKInterfaceCatalog/Introduction/Intro.html#//apple_ref/doc/uid/TP40015046

https://developer.apple.com/library/prerelease/ios/samplecode/Lister/Introduction/Intro.html#//apple_ref/doc/uid/TP40014701 

 

Apple Watch Programming Guide

ここからはApple Watchの開発ガイドに沿って説明していきます。

 

 

Configuring Your Xcode Project

WatchKitアプリを作成するためにまずは既存のiOSアプリを用意します。WatchKitアプリはXcodeプロジェクトの別のターゲットとして実装され、iOSアプリバンドルにパーケージされます。

 

 

Adding a WatchKit App to Your iOS Project

既存のiOSアプリにWatchKitターゲットを追加します。

  1. XcodeでiOSアプリを開きます。
  2. File > New > Targetを開き、Apple Watchセクションに移動します。WatcKit Appを選択します。
  3. Nextをクリックします。
  4. GlanceまたはカスタムNotificationを実装するならば、該当するチェックボックスをチェッックします。
    Notificationインタフェースの場合、すぐに実装する予定でなくても、チェックボックスにチェックをすることをお勧めします。チェックをいれると、Notificationをデバッグするファイルをプロジェクトに追加します。オプションを選択しない場合、手動でファイルを作成する必要があります。
  5. Fnishをクリックします。

XcodeはWatchKitアプリとWatchKit拡張のターゲットを設定し、必要なファイルをiOSプロジェクトに追加します。新しいターゲットの両方にiOSアプリのバンドルIDに基づきバンドルIDが自動で設定されます。3つ全てのバンドルIDが一致している必要があります。iOSアプリのバンドルIDを変更した時には、それに応じて他のバンドルIDを更新する必要があります。

 

 

App Target Structure

XcodeプロジェクトにWatchKit App ターゲットを追加し、2つの新しい実行ファイルを作成し、プロジェクトの依存関係を追加します。 iOSアプリのビルドは3つ全ての実行可能ファイル(iOSアプリ、WatchKitエクステンション、WatchKitアプリ)をビルドしそれらを一緒にパッケージします。XcodeはWatchKitアプリのデバッグビルドするbuildスキーマも作成します。

次の図はアップルのiOS Developer Libraryからの転載です。この図はiOSアプリとWatcKitの実行ファイルの構造を示しています。WatchKitのアプリはWatchKit extensionの中に入っていてそれがiOSアプリの中に入っているという順番になっています。ユーザーがiOSアプリをiPhoneにインストールすると、ペアリングされたApple Watchが利用可能であればユーザーにアプリをインストールするためのプロンプトを表示します。インストール処理はiOSにより自動的に処理されます。

出典 https://developer.apple.com/

 

 

The Build, Run, and Debug Process

WatchKit app tergetを作成すると、Xcodeは自動的にWatchKitアプリの実行とデバッグ用のbuildスキーマを構成します。起動しシミュレータやデバイスでアプリを実行するにはこのスキーマを使用してください。

glanceやcustom notificationインタフェースを含むアプリでは、追加でそれらのインタフェースをテストするためのビルドスキーマを構築してください。シミュレータでglanceインタフェースをデバッグするにはglanceスキーマーを使い、dynamic notificationとstatic notificationインタフェースをテストするにはnotificationスキーマを使用します。

glanceとnotificationのインタフェース用のカスタムbulidスキーマを構築するには

  1. 既存のWatchKitアプリのスキーマを選択します。
  2. スキーマのメニューより「Edit Scheme」を選択します。

    edit_scheme_menu_2x
    出典 https://developer.apple.com/
  3. 既存のWatchKitアプリのスキーマをDuplicatして、適切な名前を設定します。例えば、次のような名前「Glance – My WatchKit app」をつけ、スキーマがglanceの実行とデバッグ用であることが明確であるようにしておきます。
  4. スキーマエディタの左側で、Runオプションを選択します。
  5. Infoタブで、新規スキーマに適切なExecutableを選択します。

    duplicate_scheme_2x
    出典 https://developer.apple.com/
  6. スキーマエディタを閉じて変更を保存します。

notificatonインタフェース用のビルドスキーマを作成するときは、テストでnotification payloadに使うJSONファイルを指定します。

 

 

Specifying a Notification Payload for Testing

iOSのシミュレータでcustom notification インタフェースをデバッグする場合、あなたがテストでインタフェースに配信したいJSON形式で格納されたデータを指定することができます。スキーマエディタを使い、notificationインタフェースが動作中にどのplayloadデータを提供するのか指定します。payload自身はファイル名に.apnsという拡張子を持つファイルとして作成します。

注意
WatchKitターゲットを作成するときにInclude Notification Sceneオプションにチェックしている場合、Xcodeはテストデータのための初期PushNotificationPayload.apnsファイルを提供します。このファイルはWatchKit extensionのSupporting Filesディレクトリに配置されます。またpayloadファイルを後から手動で作成することもできます。

PushNotificationPayload.apnsファイルはremote notificationをシミュレートするのに必要なキーのほとんどを含んでおり、必要に応じてキーを追加することができます。

PushNotificationPayload.apns_2x
出典 https://developer.apple.com/

全てではありませんがほとんどのJSONデータはdictionaryにパッケージされ、実行時にコードに配信されいます。iOSシミュレータはiOSアプリの登録済みアクションへのアクセス権を持たないため、payloadファイルはインタフェースに表示するアクションボタンを指定することもできます。WatchKit Simulator Actionsキーは1つのdictionaryのarrayを持ち、インタフェースに追加するアクションボタンを表しています。各dictionaryは2つのキーが含まれ、

  • title – このキーの値はアクションボタンのタイトルです
  • identifier – このキーの値はinterface controllerに渡される文字列です。
    application:handleActionWithIdentifier:forLocalNotification:completionHandler: もしくは
    application:handleActionWithIdentifier:forRemoteNotification:completionHandler: メソッドに渡されます。
  • destructive – このキーの値は1か0です。1は削除アクションを提供することを示すボタンとして表示され、0は通常ボタンとして表示されます。このキーはオプションです。

JSON payloadを持つinformationインタフェースをテストするには、適切なpayloadファイルをbuildスキーマに設定します。Executableでnotificationインタフェースを選択すると、Xcodeはpayloadファイルを選択するためのメニューを表示します。あなたは別のnotification payloadを使う別のbuildスキーマを作ることもできますし、テスト前に既存のbuildスキーマのpayloadファイルを更新することもできます。

 

 

WatchKit App Architecture

Apple Watch用にビルドされたアプリはWatchKit AppとWatchKit Extensionの2つのパーツで構成されます。WatchKitアプリはApple Watch内に存在し、コードは無く、ストーリーボードとリソースだけが含まれています。WatchKit ExtensionはiPhone内(iOSアプリ内に含まれて)に存在し、WatchKit アプリのインタフェースを管理するためのコードとリソースファイルを含んでいます。

WatchKit アプリとWatchKit Extensionはインタフェースを実行するために互いに連携し合って動作します。Apple Watch上のアプリでユーザーインターフェースが必要な時、WatchKitアプリはユーザの操作を処理するためストーリボードから適切なシーンを選択します。例えばglanceを表示するとき、それはglanceシーンを選択します。シーンの選択の後、WatchKitはペアリングされたiPhoneにWatchKit extensionを起動しシーンの管理に必要なオブジェクトを作成するように指示します。シーンが正しく設定されている場合、Apple Watch上に表示されます。WatchKitアプリとWatchKit extension間での情報の伝達はシーンの裏側で透過的に実行されます。

app_communication_2x
出典 https://developer.apple.com/

 

各シーンはWKInterfaceControllerクラスのインスタンスである単一のinterface controllerオブジェクトによって管理されます。WatchKit内のinterface controllerはiOSのview controllerと同じ目的を果たたします。それは画面上のコンテンツを提供・管理し、そのコンテンツによりユーザーとの対話に応答します。view controllerと異なるのは、interface controllerは実際のビューとインタフェースを管理しないという点です。それらのビューはWatchKitによってシーンで管理されている。

WatchKit アプリは一般的に複数のinterface controllerを含んでおり、各interface controllerは異なるタイプの情報を表示する。画面上に一度には1つのinterface controllerしか表示できないので、アプリはユーザーのアクションに応じて、新たにinterface controllerを提供します。アプリはモーダルでinterface controllerを提供します。ナビゲーションスタイルのアプリもまた、どのinterface controllerを提供するか決定する。新しいinterface controllerを提供する方法については、Interface Navigationを参照してください。

 

WatchKit App Life Cycle

AppleWatchとユーザーとのやりとりはアプリの起動とそのライフサイクルで動作します。ユーザーはアプリをホームスクリーンより起動、glanceと対話、そしてカスタムUIを使用したnotificationの表示を行うことができます。各操作はWatchKit アプリを起動しWatchKit extensionと通信します。ユーザーがアプリの操作をやめその時点でiOSが次のユーザー操作までextensionをサスペンド状態にするまでWatchKitアプリとWatchKitは情報をやり取りします。

起動時には、WatchKitは自動的に現在の操作に適切なシーンを読み込みます。もしglanceを表示した場合、ストーリーボードからglanceシーンを読み込み、ユーザがアプリを直接起動した場合、アプリの初期シーンを読み込みます。シーンを読み込んだ後は、ユーザーにシーンを表示する準備のために使用するinterface controllerオブジェクトを作成するようWatchKit extensionに依頼します。次の図はこの一連のステップを示しています。

launch_cycle_2x
出典 https://developer.apple.com/

 

initと awakeWithContext: メソッドをインタフェースオブジェクトに値をセットするのに必要なデータを読み込み、インタフェースが表示されるように準備するために使用します。willActiveメソドはinterface controllerの初期化に使用しないでください。willActiveメソッドは、画面上にインターフェースが表示される前の短い呼び出しです。そのため、直前の変更のみに使用すべきです。例えば、アニメーションを開始したり、インタフェースが画面に表示されている間のみに発生させたいタスクを開始するためにこのメソッドを使用する場合が有ります。

interface controllerが表示されている間、ユーザー操作はinterface controllerのカスタムアクションメソッドによって処理されます。ユーザーがテーブル・ボタン・スイッチ・スライダーなどのコントロールを操作すると、WatchKitはそれに対応できるようにアクションメソッドをコールします。インタフェースを更新したり関連するタスクを実行するためにそれらのアクションを使用します。別の契機によりタスクを実行するには、NSTimerオブジェクトを使い指定した時間にコードが実行されるようにします。

注意
Glanceインタフェースはアクションメソッドをサポートしません。glanceインタフェースをタップするとアプリケーションが立ち上がります。

WatchKit extensionはユーザーがApple Watchで操作している間のみ実行されています。Apple Watchの操作は短いため、interface controllerは軽量で長時間のタスクを実行しないようにします。Apple Watchを明確にアプリを停止するか操作をやめるかすると、iOSは現在のinterface controllerを停止し、extensionをサスペンドします。

watch_app_lifecycle_simple_2x
出典 https://developer.apple.com/

 

 Tasks to Perform at Different Stages of an App’s Life

アプリの様々な状態において、iOSは応答の機会を与えるためWKInterfaceControllerオブジェクトのメソッドを呼び出します。次の表はそれらを実行する種々のタスクと同様にほとんどの場合interface controllerに実装すべき重要なメソッドです。

WKInterfaceControllerの主要メソッド 
方法 実行するタスク
init このメソッドはinterface controllerを初期化する最初の機会です。
awakeWithContext:  このメソッドにより使用可能なコンテキストデータを使用してinterface controllerを設定できます。データの読み込みと、ストーリボードのシーンのラベル、画像、テーブルなどのインタフェースオブジェクトを更新するために使用します。コンテキストデータは新しいinterface controllerの設定を支援するために提供するデータです。例えば、階層型のインタフェースで新しいinterface controllerをプッシュする場合、次のレベルを表示するデータが含まれるコンテキストオブジェクトを指定します。コンテキストオブジェクトの提供が推奨されていますが、必須ではありません。
 willActivate  このメソッドによりインタフェースがユーザーに表示されることを知ることができます。このメソッドではインタフェースの軽微は変更のみに使用してください。例えば、新しいデータに基づきラベルを更新する場合はこのメソッドを使用します。まとまったインターフェース初期化処理はinitかawakeWithContext:メソッドで実行すべきです。
 didDeactivate  didDeactivateメソッドはインタフェースの後処理を行い、休止状態に入るときに使用されます。例えば、このメソッドはタイマーを無効にしたりアニメーションを停止するために使用します。このメソッドではインターフェースオブジェクトに値を設定することはできません。このメソッドが呼ばれた時点からwillAcitiveが再び呼び出されるまでの間は、インターフェースオブジェクトに値を設定する試みはすべて無視されます。

Debugging Your Activation Code in iOS Simulator

テスト中はアクティブ化・非アクティブ化コードが期待通り動作していることを確認するためにシミュレータをロック・アンロックできます。シミューレータでHardware > Lockを使うとWatchKitはカレントinterface controllerのdidDeactivateメソッドを呼び出します。その後シミュレータのロックを解除すると、WatchKitはinterface controllerのwillActivateメソッドを呼び出します。

 

 

Sharing Data with Your Containing iOS App

iOSアプリとWatchKit extensionが同じデータに依存している場合、データを共有するためにapp group共有を使用します。app groupは複数のプロセスがアクセスできるセキュアなコンテナです。WatchKit extensionとiOSアプリは別のサンドボックス環境で実行されるため、通常互いにファイル共有や直接通信することが出来ません。app groupは2つのプロセス間でのファイルの共有やユーザーデフォルト情報(NSUserDefaults)の共有を可能にします。

iOSアプリとWatchKit extensionのCapabilitiesタブからapp group共有を設定します。App Group 機能を有効にすると(必要ならば)両方のターゲットに資格ファイルを追加し、そのファイルにcom.apple.security.application-groups権限を与えます。データを共有するには、両方のターゲットで同じapp groupを選択する必要があります。

実行時には、shared container ディレクトリでファイルを読み書きすることでプロセス間でファイル共有を行います。containerディレクトリにアクセスするには、NSFileManagerのcontainerURLForSecurityApplicationGroupIdentifier:メソッドを使いディレクトリのベースURLを取得します。得られたURLはディレクトリの内容を列挙したり、新たにディレクトリ内にファイルへのURLを作るために使用します。

アプリ間でプリファレンスデータを共有するためには、共有グループの識別子を用いてNSUserDefaultsオブジェクトを生成します。NSUserDefaultsのinitWithSuiteName:メソッドは共有ユーザーデフォルトデータへのアクセスを許可したオブジェクトを生成します。互いのプロセスはこのデータにアクセスし変更内容を書き込むことが出来ます。

 

 

Communicating Directly with Your Containing iOS App

アプリがiOSアプリと密に連携するためにopenParentApplication:reply:メソッドを使いアプリにリクエストを送信し、レスポンスを受け取ることが出来ます。WatchKit extensionはユーザーがApple Watchを操作している間のみ実行され、バックグラウンドでの実行モードをサポートしません。iOSアプリは制限が少なく、バックグラウンドで実行できるので、WatchKit extensionの代わりに情報を収集するように構成することが出来ます。ユーザーの位置を取得するといった、完了までに多くの時間を必要とするかもしれない動作は、iOSアプリで実行してWatchKit extensionに情報を返却すべきです。

openParentApplication:reply:メソッドを呼び出すことで、iOSはiOSアプリをバックグラウンドで起動またはサスペンドより復帰させ、application:handleWatchKitExtensionRequest:reply:デリゲートメソッドを呼び出します。アプリのデリゲートは要求を実行しWatchKit extensionにデータを返すためにdictionaryを提供するために使用します。

 

 

Leeraging iOS Technologies

iOSの技術を活用

WatchKit extensionはiOSアプリと同じ技術へのアクセスを持ってますが、extensionなので、幾つかの機能については制限されたり推奨されなかったりします。次に特定の技術の使用するタイミングを決定する幾つかのガイドラインを示します。

  • Core Locationのような、ユーザーの許可を必要とするような機能は使用しないでください。WatchKit extensionでこの機能を使用して最初のリクエストを行うときにユーザーのiPhone上で予期しないプロンプトを表示します。悪い事に、それはiPhoneがユウーザーのポケットに入っていて見れない時に発生するかもしれません。
  • 機能としてバックグラウンド実行モードを使用しないでください。WatchKit extensionはWatchKitアプリの操作時のみ実行され、それゆえにフォアグラウンドのextensionである。その結果、WatchKit extensionは幾つかの機能でサポートされているバックグラウンドモードを実行することができません。
  • 機能として長時間にわたるタスクを実行することは避けてください。WatchKit extensionはユーザーがWatchKitアプリの操作を停止した直後に中断されます。WatchKitアプリの操作は一般的に短いので、extensionはリクエストしたデータを受け取る前に中断されることがあります。

長時間にわたるタスクを実行するための最適な方法は、iOSアプリでタスクを実行するようにすることです。例えば、WatchKit extensionで位置情報サービスを開始するのではなく、iOSアプリで開始するようにします。iOSアプリは必要なデータを集めて後でextensionがアクセスできるように共有app groupにデータを格納することができます。タスクを開始したり返信を受け取ったり、共有グループコンテナでiOSアプリとWatchKit extensin間で通信するために openParentApplication:reply:メソッドを使います。iOSアプリとWatchKit extension間で通信を制御する方法については Communicating Directly with Your Containing iOS Appを参照してください。

 

Handoff Support

Apple WatchはHandoffを用いて他のデバイスで完了することのできるアクティビティの作成をサポートします。アクティビティの作成と他のデバイスへの通知にはWKInterfaceControlllerのupdateUserActivity:userInfo:webpageURL: メソッドを使うことができます。

glanceを除き、Apple Watchは他のデバイスにより生成されたアクティビティを処理することができません。glance interface controllerでは、メインアプリで使われる情報を指定するアクティビティディクショナリーを使用することができます。ユーザーがglanceをタップしてアプリを起動すると、WatchKitはアプリのメインinterface controllerにアクティビティーディクショナリーを提供します。interface controllerはアプリのUIを更新するためにディクショナリーのコンテンツを使用することができます。glanceからアプリに情報を渡す方法については、Customizing App Launch From Your Glanceを参照ください。

 

 

Remote Control Events and Now Playing Information

Apple WatchはペアリングされたiPhoneの音楽や動画の再生を管理するためリモートコントロールイベントシステムを使っています。glanceのトランスポートコントロールは、現在コンテンツを再生しているアプリへのリモートコントロールイベントを生成します。MPRemoteCommandCenterオブジェクトのコマンドを処理するように登録されたiOSアプリでは、それが「再生中」アプリであるとき、それらのイベントを自動的に受け取ります。Apple WatchからのリモートコントロールイベントをサポートするためにWatchKit extensionに追加の作業をする必要はありません。

注意
好き、嫌い、アイテムのブックマークをするフィードバックコマンドには、Apple WatchはlocalizedTitleやMPFeedbackCommandオブジェクトを使う代わりに、localizedShortTitleを使います。

再生中glanceは現在再生中のiOSアプリによって提供される「Now Playing」情報を自動的に表示します。iOSアプリはMPNowPlayingInfoCenterを使いこの情報を提供します。アプリがコンテンツを再生する時、nowPlayingInfo ディクショナリの値を更新すべきです。Apple Watchは自動的にこの情報を見つけ、ディスプレイに表示します。さらに、再生中glanceでトラックタイトルをタップすると、利用可能な場合、アプリのWatchKitアプリを起動します。

リモートコントロールイベントと現在再生中の情報へのサポートをiOSアプリに実装する方法については、 iOSイベント処理ガイドの遠隔制御イベントを参照してください。

 

WatchKit Apps

App Essentials

WatchKit アプリの基本

XcodeはWatchKitアプリインタフェースを作成するためにストーリーボードのサポートを提供します。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です