新人奮闘記20
iOS入門
ApplewachとiOSを連携させるアプリを作る機会があったので、両者の通信について書きたいと思います。
AppleWachとiPhoneを間でのデータの橋渡しをする方法でWatch Connectivityを使った方法があります。
現時点でiOSBundle内にあるリソースをWatchOSから利用するといった事が出来ないため、この方法を使う事が推奨されています。
ファイル転送を例におおまかな実装の流れとしては…
[iOS側]
Bundle内のファイルを読み出し。
↓
読み出した、ファイルを共有フォルダへ移動。
↓
移動後のデータをWatch Connectivityにて転送。
[WatchOS 側]
転送されてきたファイルを受信し一時保存フォルダへ保管(自動)
↓
一時保存フォルダからファイルをローカルへ保存
↓
ローカルからファイルを利用
iOSは自Bundle内のデータ(リソース)を読み出し、それをWatchConnectivityを使って、WatchExtensionへ転送します。
WatchOSは、転送されてきたデータを受信し、そのデータを何らかの形で使用する。という用途が一般的かと思いますが、ハマりポイントとして、この方法(Session)で送られてきたデータ(ファイル)は永続化しないので、ローカルに保存する必要があるという事です。この時、どこからどこへ移動するべきかという所ですが、iPhoneが近くに無いなどの状況でもAppleWatch側でデータを利用できた方が良いので、AppleWatchのローカルに移動(保存)するべきだと思いました。
まずWatchConnectivityでiPhoneからAppleWatchへ送られたデータは、何処にあるかの検証してみましたが、ファイル受信成功時のデリゲートメソッドfunc session(_ session: WCSession, didReceive file: WCSessionFile)にて
file.fileURLで位置が確認でました。ですがこの情報は受信する毎に変化するので、目視する必要がありません。
ターミナルなどで確認してみたものの、 ~ /送信元端末ID/Files/ 以下のパスは表示されません。なぜなら、このメソッド実行後は、fileが削除されてしまうので、すぐに移動する必要があります。
結局のところローカルへ移動して下さいという仕様という事で、Appleのリファレンスはしっかり目を通さないといけないとつくづく感じました。
まとめ
ファイルを転送された時、受信側では、そのファイルを再帰的に利用する場合、ファイルが消える可能性があるためローカルへ保存する必要がある。
また、ペアリングの状態や、デバイスが対応しているか、相手端末がアクティブな状態にあるか、などの値を取るAPIがあるので、用途によってバリエーションを増やす事ができます。
WatchConnectivityフレームワークを使えば、リアルタイムにAppleWatchと通信する事ができ、バックグラウンドではファイルやデータの転送といった事ができるので、DBファイルなどの共有といった事も出来そうです。
admin at 2016年11月17日 10:00:24