iPhoneとApple Watchでデータのやり取りをする | サンプルコードSimpleWatchConnectivityについて

iPhoneとApple Watchで通信をするのに、Watch Connectivityというフレームワークがあります。

Watch Connectivity

Apple公式のサンプルコードが用意されています。
Implementing Two-Way Communication Using Watch Connectivity

用途の異なるいくつもの通信用メソッドがあり、それらを実験できるプロジェクトです。
機能がたいそう盛り込んであって、把握するのが大変なところがあります。
この記事では、サンプルプログラムの準備、使い方について記しています。

準備

サンプルコードのページにも記してありますが、実行するにはいくらか準備が必要です。

TARGETSからSimpleWatchConnectivityの[General]ペインで、[Bundle Identifier]を新たな識別子で更新。

WatchKitExtensionのBundle Identifier

[Signing & Capabilities]ペインで、[Team]ドロップダウンメニューから適切なチームを選択

同様に、TARGETSから、WatchKit AppとWatchKitExtensionのBundle Identifierと開発者Teamを変更。
Bundle Identifierは、SimpleWatchConnectivityでつけた名前に、それぞれれ.watchkitapp、.watchkitapp.watchkitextensionを付け加えます。

Targets
WatchKit AppのBundle Identifier
WatchKit ExtensionのBundle Identifier

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(:)は、状態の同期に用いるのに適しています。
サンプルでは、ボタンが押されるたびに色変えを行います。

iPhone側
Apple Watch側

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が表示され進行度が表示されます。

ところで、ファイルを送受信する場合には注意点があります。
ファイルを受け取った際には、WCSessionDelegatesession(_: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」を押したときの結果を見るには準備が必要です。

  1. iPhoneのWatchアプリ> 文字盤ギャラリー> 「モジュラー」を加える
    (もしくは、Apple Watchで文字盤を長押し> 右スワイプ> 新規から「モジュラー」を加える)
  2. 文字盤を「モジュラー」に設定
  3. iPhoneのWatchアプリ> 「モジュラー」を選択。コンプリケーション」で「中」を選択。SimpleWatchConnectivityのSimpleWCを選択
    (もしくは、Apple Watchで文字盤を長押し> 編集> 中央の横に細長い部分を選択。SimpleWatchConnectivityのSimpleWCを選択)

以上の手順で、文字盤が「モジュラー」となり、中央部分にSimpleWatchConnectivityのSimpleWCコンプリケーションが設定されます。

サンプルプログラムでは、iPhone側で「TransferComplicationUserInfo」を押すと、Apple Watch側に
ランダムな数字が表示されます。


コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください