RabbitBoxのデータをデバイス間で共有したい話 その2(iCloud編)

前回から続きまして、具体的にiCloudでどのようにAppデータを共有すればよいか調べました。色々とわからないことが多かったのですが、なんとなく概要がわかってきたので書いていきます。

RabbitBox - 画像ダウンロードと整理のアプリ

RabbitBox - 画像ダウンロードと整理のアプリ

  • Yoshinobu Sugain
  • ユーティリティ
  • 無料
apps.apple.com

そもそもiCloudってなに?

当たり前のようにiCloudを利用していますが、意外とiCloudが何かわかりません。なので調べてみました。

iCloudAppleの提供するクラウドサービスで、写真やファイルのクラウドストレージ保存をはじめ、バックアップ、メール、パスワード保存など非常に多くのサービスを提供しています。これらで消費するデータ容量は基本的にいわゆるiCloudストレージから消費されるので、共通のフレームワークで提供されているように感じますが、実際のところは仕様もドキュメントもフレームワークもバラバラで非常に難解です。

iCloudでAppデータのデバイス間同期

前述のようにiCloudには非常に多くの機能が含まれます。このため、Appデータのデバイス間同期を行う選択肢も次のように複数あります。

  • iCloud (Foundation)
    • NSUbiquitousKeyValueStore
    • iCloud document storage
  • CloudKit
  • iCloud Drive

現在RabbitBoxではiCloud Driveを採用して開発中ですが、一通り概要を書いていきます。

iCloud(Foundation)

iCloudと書くと非常に混乱しそうなので、iCloud(Foundation) と記載しています。 次のドキュメントにある機能です。

developer.apple.com

developer.apple.com

名前の通り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のデータを配信したりできるようです。

developer.apple.com

CloudKitの採用に関する参考ドキュメントがあります。

developer.apple.com

ざっくりまとめると次のような感じかと思います。

  • データをファイルとして保存したい
    • iCloud document storage の方がシンプルやで🤗
    • バックアップ目的のみならiCloud Backupで十分や😘
  • シンプルなデータをデバイス間で共有したい
    • NSUbiquitousKeyValueStore使え😡
  • オブジェクトをデバイス間で共有したい
    • CloudKitええで😤

かなり有力な候補だったのですが、次のような理由からやめました。

  • 画像ファイルを大量に扱うため相性が良くなさそう
  • iOS以外のサポートも一応選択肢として残しておきたかった
  • 実現したいことに対してオーバースペック

最終的には次に紹介するiCloud Driveを利用する方式に決めました。

iCloud Drive

他の選択肢と異なり、App側にiCloudによる同期処理を実装するものではありません。 Appをドキュメントファイルの保存、読み込みに対応させ、そのドキュメントをiCloud Drive上に保存することで複数デバイス間でのデータ共有を実現する方法です。

developer.apple.com

iOS/iPad OS AppのiCloud対応で調べても意外と出てこなかったのですが、 PC向けアプリ界隈では非常に自然な仕様です。

この方式のメリットは次のようなものです。

  • iCloudに限らず様々なストレージへドキュメントを移動させられる
  • 将来的な別プラットフォーム対応も視野に入れられる
  • iCloudへの依存を比較的小さく抑えることができる

これで万事解決じゃーん🎉 なんて考えていましたが、この後いろいろ苦労します……

Document-based App地獄編へ続く