watchOSアプリで保存したファイルを取り出す方法を検討する
watchOS側でセンサーデータをファイルに保存し、それを何らかの形で取り出したい。今ならいろいろな方法が考えられる。
・App Groupsで親iPhoneとデータ共有
・WatchConnectivityで親iPhoneアプリに送る
・CloudKitでiCloudに保存
それぞれ試してみる。
なお、キリがないのでバックエンドを用意する方法は(FirebaseやDropboxも含めて)除外。
App Groupsで親iPhoneとデータ共有
App Groupsの設定手順はたくさん記事が出ている。簡単に書くと、
1. Developer CenterでGroup IDを作成する
2. Xcodeで、CapabilitiesにApp Groupsを追加して、1で作成したIDを選択する。iOSアプリのターゲットと、WatchKit Extensionのターゲット両方。
3. ファイルをApp Groupsのコンテナディレクトリに保存する。
let url = FileManager.default.containerURL(
forSecurityApplicationGroupIdentifier: "group.com.xxxx")!
で、iOSアプリ側で同じコードでコンテナディレクトリのURLを取得してファイルを取り出そうとしてみると・・・
URLのパスに含まれているUUID的な部分がwatchOS側とiOS側で違う。
もちろん保存したはずのファイルは見えない。
ググると、フォーラムでこういうのを見つけた。
[app group container path is different on watch app |Apple Developer Forums](https://forums.developer.apple.com/thread/11918#58494)
If you're using watchOS 2 you can't use App Groups to share files since the watch extension runs on the watch, not the phone.
なんと、watchOS 2からはextensionが(iPhone側ではなく)Apple Watch側で動くようになったため、App Groupsによるファイル共有は使用できないとのこと。
同スレッドで、Appleの中の人も同様の回答をしている。
You can use an App Group on watchOS 2, but it will not sync with an App Group on iOS. They will be independent — the watch app and phone app won't share data — so you need to manage the syncing yourself.
There is one exception, though, and that is the settings bundle. That will be synced from iPhone to Watch automatically.
extensionがウォッチ側で動くようになったのは把握していたが、App Groupsはデバイスを超えていい感じにローカルディレクトリを同期してくれるのかと勘違いしていた...
WatchConnectivityのファイル転送で親iPhoneアプリに送る
これに書いたが、今回はメッセージの送信ではなくファイル転送機能を使う。
最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/