【watchOS】Watch Connectivity 入門

Watch ConnectivityはiOS AppとペアリングされたwatchOS AppのWatchKit Extension間で、データをやり取りするために必要なフレームワークです。Watch Connectivityフレームワークを使用することで、少ないコードでiOS AppとwatchOS App間でデータのやり取りを行うことができます。
本記事ではiOS AppとペアリングされたwatchOS Appでデータのやり取りを行う方法と、やり取りを行うAPIの各種特徴について書きます。
サンプルコードは以下のGitHubに置いていますのでご自由にご参照ください。

iOS App / watchOS App間でデータのやり取りを行う流れ
- iOS / watch Appで
WCSessionの設定と有効化 - iOS / watch Appでデータの送信処理
WCSessionの設定と有効化
iOS AppとwatchOS App間でデータのやり取りを行うためには、各AppでWCSession クラスのオブジェクトの設定と有効化を行う必要があります。
最初にWCSession.defaultSession() でセッションオブジェクトを取得し、取得したセッションオブジェクトにデリゲートを割り当てます。
最後にセッションオブジェクトのactivate() でセッションを有効化します。この一連の処理をiOS AppとwatchOS Appで行います。
データの送信処理
データのやり取りを行うためのメソッドは以下の4つが用意されています。
sendMessage(_:replyHandler:errorHandler:)updateApplicationContext(_:)transferUserInfo(_:)transferFile(_:metadata:)
sendMessage 以外はバックグラウンド送信に対応しており、送信先Appがバックグラウンド状態だとしても、送信先Appがアクティブな状態に遷移した時にデータを受け取ることができます。
sendMessage(_:replyHandler:errorHandler:)
即座にデータを送信したい時に使用するメソッドです。送りたいデータは[String: Any] 型のValueに格納し、sendMessage の引数に指定します。

updateApplicationContext(_:)
送信先Appがフォアグラウンド状態になった時、送られてきたデータの中で最新のデータのみを受け取れば良い時に使用するメソッドです。複数のデータを送信した時は、以前送信したデータは新しいデータで上書きされます。送りたいデータは[String: Any] 型のValueに格納し、updateApplicationContext の引数に指定します。

transferUserInfo(_:)
送信先Appがフォアグラウンド状態になった時、送られてきたデータを全て受け取る必要がある時に使用するメソッドです。送信したデータはキューにスタックされます。送りたいデータは[String: Any] 型のValueに格納し、transferUserInfo(_:) の引数に指定します。
transferFile(_:metadata:)
画像や動画、ファイルベースのドキュメントといったファイルサイズが大きいデータを送信する時に使用するメソッドです。送りたいデータの場所が格納されているURL 型のオブジェクトをtransferFile(_:metadata:) の引数に指定します。

データの受信処理
WCSessionDelegate には送られてきたデータを受信するための各種メソッドが定義されています。最初にWCSession.defaultSession() でセッションオブジェクトを取得した時に指定した移譲先のクラスでデリゲートメソッドを定義します。
session(_:didReceiveMessage:replyHandler:)
sendMessage で送られてきた[String: Any] 型のオブジェクトを受信するメソッドです。引数の[String: Any] 型のオブジェクトに適切なキーを指定して、必要なデータを取り出します。
session(_:didReceiveApplicationContext:)
updateApplicationContext で送られてきた[String: Any] 型のオブジェクトを受信するメソッドです。引数の[String: Any] 型のオブジェクトに適切なキーを指定して、必要なデータを取り出します。
session(_:didReceiveUserInfo:)
transferUserInfo で送られてきた[String: Any] 型のオブジェクトを受信するメソッドです。引数の[String: Any] 型のオブジェクトに適切なキーを指定して、必要なデータを取り出します
session(_:didReceive:)
transferFile で送られてきたURL 型のオブジェクトを受信するメソッドです。データが格納されているURL からデータを取り出します。
その他
データを送信する各メソッドには送信可能上限が設定されています。
2023/01/13時点では以下のように設定されています。
| メソッド名 | 上限 |
|---|---|
| sendMessage | 65,536 bytes (65.5 KB) |
| updateApplicationContext | 65,536 bytes (65.5 KB) |
| transferUserInfo | 262,144 bytes (262.1 KB) |
参考資料
・Watch Connectivity
・Introducing Watch Connectivity
Discussion