Swift watchOSアプリ開発事前確認
iOSアプリとwatchOSを連携したプロジェクトが作成できたので、watchOSアプリの作成に向けて外観をつかんでおこうと思う。
例によって、Apple Develperのサイトなどから関係ありそうなところかいつまみながら、
機械翻訳で訳したものを要約、はりつけしながらメモ。
1.watchOS Apps
Apple Watchでは、インタラクションをできる限り短くします。重要な情報をひと目で伝え、数回のタップで反応するように促したら、手首を下げて次に進みましょう。
アクションが成功するかどうかを待つ必要はなく、重要なアップデートがあればwatchOSアプリケーションが自動的に通知します。
watchOSでは、実際のコードを書くよりも、アプリケーションのエクスペリエンスの計画、設計、改良に多くの時間を費やすことが予想されます。
デザインの指針については、Apple Watch Human Interface Guidelinesを参照。
1.1 メインアプリ
ウォッチエクスペリエンスの基盤となるものです。誰でもアプリを直接起動し、操作することができます。
しかし、アプリのインターフェイスは、必ずしも人々がアプリと対話する主な方法とは限りません。
多くの人は、コンプリケーションや通知を通じて対話することを好み、アプリを明示的に起動することはないかもしれません。
1.2 コンプリケーション
コンプリケーションは、アプリのデータをウォッチフェイス上で直接確認できるようにするものです。
ほとんどの時計の文字盤にコンプリケーションを追加することができますが、スペースは限られています。
コンプリケーションは、タイムリーで、最新の、そして役に立つ情報を表示するようにデザインしましょう。
また、ユーザーはコンプリケーションをタップすることで、すばやく簡単にwatchOSアプリケーションを起動することができます。
1.3 通知
重要なイベント発生また、アプリを開かなくてもすぐに対応できるように、アクションを提供することもできます。
アプリが起動していなくても、ローカル通知とリモート通知のいずれかを使ってコミュニケーションをとることができます。
1.4 Siri
Siriを使って、あなたのアプリケーションとのインタラクションの方法を広げましょう。
SiriKit Intentsを使えば、人々はあなたのアプリケーションを声で操作できるようになります。
同様に、あなたのアプリケーションは、Siriのウォッチフェイスに表示されるショートカットをシステムに寄付することができます。
SwiftUIによるwatchOSアプリの構築の説明がここに記述されており推されているようだが、Storyboardの方が肌に合うのでそちらを利用する。
3.独立したwatchOSアプリの作成
XcodeでwatchOSのプロジェクトを構成するには、次の2つの方法があります。
3.1 ウォッチアプリ
このオプションは、Apple Watchでのみ利用可能で、関連するiOSアプリがない新しいエクスペリエンスを作成する場合に使用します。
3.2 iOSアプリとWatchアプリ
iOSアプリがあり、類似または関連するエクスペリエンスを提供するwatchOSアプリを提供したい場合に、このオプションを使用します。
watchOS ターゲットを作成する際に、ビルドしたい watchOS プロジェクトの種類を指定します。watchOS アプリを iOS アプリにバンドルする場合、watchOS アプリが iOS コンパニオンとどのように相互作用するかを指定する必要があります。
3.3 独立したアプリ
iOSのコンパニオンアプリがなくても、正常に動作します。ユーザーは、iOSアプリケーション、watchOSアプリケーション、またはその両方をインストールすることを選択できます。
3.4 依存するアプリ
iOSコンパニオンが正しく機能するように、依存するアプリを作成します。
依存アプリは、watchOSアプリがコンパニオンと相互作用する必要がある場合にのみ作成してください。
ユーザーは、iOSコンパニオンと一緒にwatchOSアプリケーションを購入し、インストールする必要があります。
watchOS 5およびそれ以前では、すべてのwatchOSアプリは依存するアプリです。
watchOS 6以降では、ユーザーはApple Watch上でApp Storeから直接watchOSアプリケーションを購入することができます。
watchOS 6.2以降では、ユーザーはApple Watchで直接アプリ内課金を行うこともできます。
プロジェクトにコンパニオンwatchOSおよびiOSアプリケーションが含まれている場合、アプリ内課金はユニバーサルです。
ユーザーは一度購入すれば、コンテンツはwatchOSとiOSの両方で利用できます。詳しくは、Original API for In-App Purchaseをご覧ください。
独立したアプリ、依存したアプリともに、watchOSアプリを直接Apple Watchにダウンロードし、インストールする仕組みになっています。
ただし、iOSアプリのインストールが終了するまで、ユーザーは従属アプリからwatchOSアプリを起動することはできません。
3.5 時計専用アプリの作成
ウォッチ専用アプリを作成するには、Xcode で新しいプロジェクトを開始し、Watch App テンプレートを選択します。
WatchKit App フォルダには、アプリが使用するアセットが含まれています。
WatchKit Extension フォルダには、アプリのコードが含まれています。
Xcodeはまた、あなたのアプリのための3つのターゲットと、あなたがプロジェクトエディタで見ることができるテストのためのターゲットを作成します。
ルートターゲットはスタブで、App Storeにプロジェクトを提出できるようにするためのラッパーとして機能します。
他の2つのターゲットは、それぞれ WatchKit アプリと WatchKit 拡張を表します。
4.主なクラス
なんとなく雰囲気がわかってきたので、まずは、メインアプリを試してみよう。コンプリケーションと通知は追って。
WKInterfaceControllerの概略だけ見ておく。
4.1 WKInterfaceController (メインアプリ)
watchOSアプリでインターフェイスを管理するためのインフラを提供するクラス。
インターフェースコントローラは、実際のビューを管理しないことを除けば、UIKit アプリにおける UIViewController オブジェクトと同じ役割を果たします。
WatchKit エクステンションの中で動作し、Watch アプリの storyboard ファイルにあるインターフェース・コントローラに関連した動作をリモートで管理します。
WKInterfaceController のサブクラスを作成し、そのメソッドを使用して storyboard シーンの要素を設定し、それらの要素とのインタラクションに応答する。
インターフェース・コントローラのコードは、ユーザの Apple Watch 上でローカルに実行されますが、それが管理するインターフェースとは別のものです。
コード内のインターフェイスオブジェクトの値を変更すると、システムが必要な情報を Watch アプリに転送し、Watch アプリが画面上で対応する変更を行います。
4.1.1 インターフェイスコントローラーを初期化する
ユーザがあなたのアプリのコンテンツとインタラクトするとき、システムはあなたの拡張機能を起動し、適切なインターフェイスコントローラオブジェクトを自動的に作成します。
アプリは、通知とアプリのインタフェースを管理するために、異なるインタフェース・コントローラを使用します。WatchKit は、アプリのメインストーリーボードファイルの情報を使用して、どのインタフェース・コントローラを読み込むかを決定します。
通知シーンは、システムが識別できるように特別に設定されています。アプリの場合、WatchKit はアプリのメインインターフェースコントローラを最初にロードしますが、起動時に最初のインターフェースコントローラを変更することも可能です。
init()
インターフェース・コントローラを作成する際、WatchKit はそのクラスのインスタンスを作成し、init() メソッドを呼び出します。このメソッドを使用して、変数の初期化やデータの読み込みを行うことができます。しかし、ユーザーインターフェースの設定には使用しないでください。このメソッドが実行されると、コントローラのユーザーインターフェース要素が適切に初期化されない可能性があります。
awake(withContext:)
次に、awake(withContext:) メソッドを呼び出します。WatchKit が有効なオブジェクトを awake(withContext:) メソッドに渡した場合、そのオブジェクトの情報を使って、初期化処理をカスタマイズします。また、この時点でコントローラのユーザーインターフェース要素が利用できることが保証されています。つまり、このメソッドを使って安全にユーザーインターフェイスを設定することができます。
willActivate()
willActivate() メソッドを使用すると、 インターフェイスがアクティブになりそうなときにそれを知ることができます。コンテンツの更新を確認するなど、直前のタスクを実行するために willActivate() メソッドを使用します; しかし、主要な初期化には使用しないでください。
willActivate()メソッドは、あなたのインターフェイスがまだ画面上にない時に呼び出されることがあります。例えば、WatchKit はコンテンツを更新する時間を確保するために、事前にこのメソッドを呼び出すことがあります。WatchKit は didAppear() メソッドを呼び出して、インターフェースが見えるようになったことを知らせます。同様に、WatchKit はあなたのインターフェースが再び画面外に移動すると、willDisappear() と didDeactivate() メソッドを呼び出します。
重要
インターフェースコントローラは、 awake(withContext:) メソッド、 willActivate() メソッド、およびインターフェースがアクティブな間のみ、インターフェースを変更することができます。システムが didDeactivate() メソッドをコールすると、 インターフェイスコントローラの willActivate() メソッドを再びコールするまで、コントローラのインターフェイスオブジェクトの値を変更しようとする試みを無視します。
iOS Simulator では、Hardware > Lock を選択してシミュレータをロックすると、WatchKit は現在のインタフェースコントローラの didDeactivate() メソッドを呼び出します。その後、Simulator をアンロックすると、WatchKit はそのインターフェイスコントローラの willActivate() メソッドを再び呼び出します。この機能は、アクティベーションとデアクチベーションのコードをデバッグするために使用できます。
4.1.2 サブクラスに関する注意事項
WKInterfaceController のサブクラスは、実行時に設定が必要なストーリーボード・シーンや、ユーザーとのインタラクションを処理するシーンがある場合に使用します。通常、アプリが管理する各ストーリーボードシーンにカスタムサブクラスを定義します。サブクラスでは、構成する必要があるインターフェースオブジェクトのアウトレットを定義し、ストーリーボード・シーンの要素とのインタラクションに応答するためのアクションメソッドを定義します。
アプリで使用するほとんどのカスタムインターフェースコントローラーは、カスタムインターフェースコントローラーのサブクラスが必要です。グランスでも、グランスの内容を更新するためにインターフェイスコントローラが必要です。カスタムインタフェースコントローラを使用できない唯一のストーリーボード・シーンは、静的通知インタフェースに関連するシーンです。動的通知インターフェース用のインターフェースコントローラを実装する場合は、代わりに WKUserNotificationInterfaceController をサブクラスにしてください。
インターフェイスを設定し、表示できるようにするために必要なクラスのメソッドをすべてオーバーライドします。ほとんどのインターフェイスコントローラは、 init() メソッドと awake(withContext:) メソッドをオーバーライドしています。その他、必要なメソッドがあればそれをオーバーライドします。
4.2 CLKComplicationDataSource(コンプリケーション)
4.3 WKUserNotificationInterfaceController(通知)