RabbitBoxのデータをデバイス間で共有したい話 その2(iCloud編)
前回から続きまして、具体的にiCloudでどのようにAppデータを共有すればよいか調べました。色々とわからないことが多かったのですが、なんとなく概要がわかってきたので書いていきます。
apps.apple.comそもそもiCloudってなに?
当たり前のようにiCloudを利用していますが、意外とiCloudが何かわかりません。なので調べてみました。
iCloudはAppleの提供するクラウドサービスで、写真やファイルのクラウドストレージ保存をはじめ、バックアップ、メール、パスワード保存など非常に多くのサービスを提供しています。これらで消費するデータ容量は基本的にいわゆるiCloudストレージから消費されるので、共通のフレームワークで提供されているように感じますが、実際のところは仕様もドキュメントもフレームワークもバラバラで非常に難解です。
iCloudでAppデータのデバイス間同期
前述のようにiCloudには非常に多くの機能が含まれます。このため、Appデータのデバイス間同期を行う選択肢も次のように複数あります。
現在RabbitBoxではiCloud Driveを採用して開発中ですが、一通り概要を書いていきます。
iCloud(Foundation)
iCloudと書くと非常に混乱しそうなので、iCloud(Foundation) と記載しています。 次のドキュメントにある機能です。
名前の通りFoundationフレームワーク内に統合されている機能です。 おそらくiCloudサービス初期に実装されたAPIだと思うのですが、少々使いづらいです。
大きく分けてNSUbiquitousKeyValueStoreとiCloud document storageを備えています。
NSUbiquitousKeyValueStoreは単純にクラウド版UserDefaultsのようなものです。シンプルな軽量データを同期するためには一番よい選択だと思います。
iCloud document storageはFileManager経由でアクセスできる機能群で、iCloudストレージへのデータアップロード、ダウンロードなどが行えます。当初はこの機能を利用する予定でしたが、RabbitBoxではより使いやすく汎用性が高いiCloud Driveを使用することにしました。 (正確にはiCloud Drive内でiCloud document storageを使用しているとは思いますが……)
CloudKit
CloudKitは他の選択肢と毛色が異なっており、BaaS(Backend as a Service)のサービスです。iCloud上にホスティングされたデータベースを利用できるイメージです。
特徴的な機能はpublicデータベースという全ユーザがアクセスできるデータベースを利用することが可能なことで、ここのデータベースを通じてAppのデータを配信したりできるようです。
CloudKitの採用に関する参考ドキュメントがあります。
ざっくりまとめると次のような感じかと思います。
かなり有力な候補だったのですが、次のような理由からやめました。
- 画像ファイルを大量に扱うため相性が良くなさそう
- iOS以外のサポートも一応選択肢として残しておきたかった
- 実現したいことに対してオーバースペック
最終的には次に紹介するiCloud Driveを利用する方式に決めました。
iCloud Drive
他の選択肢と異なり、App側にiCloudによる同期処理を実装するものではありません。 Appをドキュメントファイルの保存、読み込みに対応させ、そのドキュメントをiCloud Drive上に保存することで複数デバイス間でのデータ共有を実現する方法です。
iOS/iPad OS AppのiCloud対応で調べても意外と出てこなかったのですが、 PC向けアプリ界隈では非常に自然な仕様です。
この方式のメリットは次のようなものです。
これで万事解決じゃーん🎉 なんて考えていましたが、この後いろいろ苦労します……
Document-based App地獄編へ続く