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アプリに送る

これに書いたが、今回はメッセージの送信ではなくファイル転送機能を使う。

ここから先は

517字
文章やサンプルコードは多少荒削りかもしれませんが、ブログや書籍にはまだ書いていないことを日々大量に載せています。たったの400円で、すぐに購読解除してもその月は過去記事もさかのぼって読めるので、少しでも気になる内容がある方にはオトクかと思います。

技術的なメモやサンプルコード、思いついたアイデア、考えたこと、お金の話等々、頭をよぎった諸々を気軽に垂れ流しています。

最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/