iPhoneとApple Watchで通信をするのに、Watch Connectivityというフレームワークがあります。
Apple公式のサンプルコードが用意されています。
Implementing Two-Way Communication Using Watch Connectivity
用途の異なるいくつもの通信用メソッドがあり、それらを実験できるプロジェクトです。
機能がたいそう盛り込んであって、把握するのが大変なところがあります。
この記事では、サンプルプログラムの準備、使い方について記しています。
準備
サンプルコードのページにも記してありますが、実行するにはいくらか準備が必要です。
TARGETSからSimpleWatchConnectivityの[General]ペインで、[Bundle Identifier]を新たな識別子で更新。
[Signing & Capabilities]ペインで、[Team]ドロップダウンメニューから適切なチームを選択
同様に、TARGETSから、WatchKit AppとWatchKitExtensionのBundle Identifierと開発者Teamを変更。
Bundle Identifierは、SimpleWatchConnectivityでつけた名前に、それぞれれ.watchkitapp、.watchkitapp.watchkitextensionを付け加えます。
WatchKit AppのInfo.plistファイルを開き、WKCompanionAppBundleIdentifierキーの値をiOS appのBundle Identifierに変更。
WatchKit ExtensionのInfo.plistファイルを開き、NSExtension> NSExtensionAttributes> WKAppBundleIdentifierキーの値をWatchKit AppのBundle Identifierに変更
サンプルでできること
実行すると図のような画面となります。下部に通信コマンドメニューが表示されています。
各項目で試せることを記します。
UpdateAppContext
updateApplicationContext(_:) | Apple Developer Documentation
updateApplicationContext(:)は、状態の同期に用いるのに適しています。
サンプルでは、ボタンが押されるたびに色変えを行います。
SendMessage
sendMessage(_:replyHandler:errorHandler:) | Apple Developer Documentation
Dictionary型のメッセージを直ちに送信します。セッションがアクティブである必要があります。
失敗するとエラーを返します
SendMessageData
sendMessageData(_:replyHandler:errorHandler:) | Apple Developer Documentation
Data型のメッセージを直ちに送信します。セッションがアクティブである必要があります。
失敗するとエラーを返します
TransferFile
transferFile(_:metadata:) | Apple Developer Documentation
ファイルをバックグラウンドスレッドで送信します。
続けて送った場合は、キューに入れられ順次送信されます。
サンプルコードでは、iPhone側の「TransferFile」では、info.plistファイルをApple Watch側に送信します
Apple Watch側の「TransferFile」では、Loggerクラスで作成したデバッグ用のログをiPhone側に送信します。
送信されるファイルは、TestDataProvider.swiftに
var file: URL {
#if os(watchOS)
return Logger.shared.getFileURL() // Use the log file for transferFile.
#else
// Use Info.plist for file transfer.
// Change this to a bigger file to make the file transfer progress more obvious.
//
guard let url = Bundle.main.url(forResource: "Info", withExtension: "plist") else {
fatalError("Failed to find Info.plist in current bundle!")
}
return url
#endif
}
とあります。
iPhone側から送るファイルは、デフォルトでは、Info.plistファイルとなっています。
画像ファイルなど大きなサイズのファイルに変更すると、送信完了まで時間がかかるので、進行度を見ることができます。
数字部分をタップすると、別Viewが表示され進行度が表示されます。
ところで、ファイルを送受信する場合には注意点があります。
ファイルを受け取った際には、WCSessionDelegateのsession(_:didReceive:)が呼ばれます。
ドキュメントに
Remember to move the file referenced by the
file
parameter if you intend to keep it. If you don’t move the file synchronously during your implementation of this method, the system deletes the file when the method returns.
とあるように、リターンするタイミングでファイルが削除されてしまうので、ファイルを別に活用したい場合は移動やコピーをしておく必要があります。
TransferUserInfo
transferUserInfo(_:) | Apple Developer Documentation
Dictionary型のデータを確実に送信します。
続けて送った場合は、キューに入れられ順次送信されます。
TransferComplicationUserInfo
transferCurrentComplicationUserInfo(_:) | Apple Developer Documentation
コンプリケーション関連のデータを送信します。
Apple Watchのコンプリケーションというのは、文字盤にアプリの情報や機能の一部を設置するものです。
サンプルプログラムで、「TransferComplicationUserInfo」を押したときの結果を見るには準備が必要です。
- iPhoneのWatchアプリ> 文字盤ギャラリー> 「モジュラー」を加える
(もしくは、Apple Watchで文字盤を長押し> 右スワイプ> 新規から「モジュラー」を加える) - 文字盤を「モジュラー」に設定
- iPhoneのWatchアプリ> 「モジュラー」を選択。コンプリケーション」で「中」を選択。SimpleWatchConnectivityのSimpleWCを選択
(もしくは、Apple Watchで文字盤を長押し> 編集> 中央の横に細長い部分を選択。SimpleWatchConnectivityのSimpleWCを選択)
以上の手順で、文字盤が「モジュラー」となり、中央部分にSimpleWatchConnectivityのSimpleWCコンプリケーションが設定されます。
サンプルプログラムでは、iPhone側で「TransferComplicationUserInfo」を押すと、Apple Watch側に
ランダムな数字が表示されます。