ObjecTips

Swift & Objective-C で iOS とか macOS とか

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

Apple Watch と 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 ラベルの更新等小さな変更を行う。初期化のほとんどは initawakeWithContext: で行う
didDeactivate Interface をクリーンアップして静止状態にする。タイマーやアニメーションの停止等を行う。このメソッドでは Interface への値の設定はできない。再び willActivate が呼ばれるまで Interface への値の設定はできない
Debugging Your Activation Code in iOS Simulator

シミュレータでのテスト

  • シミュレータのロックとアンロックで willActivatedidDeactivate をテストできる
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 を介してファイルを共有できる。NSFilemanagercontainerURLForSecurityApplicationGroupIdentifier: メソッドを使う
  • 設定を共有するには NSUserDefaultsinitWithSuiteName: メソッドを使う
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

ハンドオフ対応

  • WKInterfaceControllerupdateUserActivity:userInfo:webpageURL: メソッドを使う
  • グランス以外では他のデバイスで作成されたアクティビティをハンドリングしない。グランスではメインのアプリで利用できる情報を特定するアクティビティの dicationary を使用する事ができる
Remote Control Events and Now Playing Information

リモート再生とNow Playing

  • iPhone上のオーディオとビデオの再生コントロールが可能
  • Now Playing グランスはアプリの remote control event を生成する
  • アプリは MPRemoteCommandCenter のコマンドを登録してイベントを自動的に受け取る
  • Apple Watchは MPFeedbackCommandlocalizedTitle の代わりに localizedShortTitle を用いる
  • Now Playing グランスはiOSアプリで現在再生されている情報を自動的に表示する。アプリでは MPNowPlayingInfoCenter を使用してこの情報を提供する

続く