📩

【watchOS】Watch Connectivity 入門

2023/01/13に公開

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

サンプルコードは以下のGitHubに置いていますのでご自由にご参照ください。
https://github.com/NAOYA-MAEDA-DEV/Watch-Connectivity-Sample

iOS App / watchOS App間でデータのやり取りを行う流れ

  1. iOS / watch AppでWCSession の設定と有効化
  2. 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)

https://stackoverflow.com/questions/33025915/how-big-can-the-payload-be-when-sending-data-via-watchconnectivity

参考資料

・Watch Connectivity
https://developer.apple.com/documentation/watchconnectivity

・Introducing Watch Connectivity
https://developer.apple.com/videos/play/wwdc2015/713/

Discussion