iCloud Storageの動作を確認するべく、サンプルコードを作って見ました。
iCloud Storageを利用するには、まずそのアプリケーションを登録しなければなりません。iCloud Storage内には、アプリケーションごとに別々に領域が確保されます。
登録するには、Mac Developer Programの会員になり、メンバーセンターで登録手続きを行う必要があります。
1. アプリケーションIDの登録
2. 開発者としての証明書の登録
3. 開発モードなら、開発機の登録
4. 規定書の作成とダウンロード
ダウンロードした規定書は、システム環境設定のプロファイルとXcodeオーガナイザーのDevicesにインストールします。
Xcodeでプロジェクトを作成したら、規定書に基づいてセットアップします。
1. Summaryで、Identifierに登録したアプリケーションIDを設定
2. Summaryで、Code Sign Applicationにチェック
3. Summaryで、Enable Entitlementsにチェック
4. Summaryで、Entitlements Fileを設定
5. Summaryで、iCloud ContainersにアプリケーションIDを設定
6. Build Settingsで、規定書に対応したCode Signing Identityを設定
これでやっと準備完了です。
iCloud Storageは、iDiskと違ってファイルシステムにマウントされません。そのため、FinderからはiCloud Storageのファイルを基本的に見る事はできません。ただし、iCloud Storage内のファイルはローカルにキャッシュされるようになっており、実際にはこのキャッシュファイルを読み書きすることで、間接的にiCloud Storageのファイルをアクセスします。このキャッシュファイルは、デーモンプロセスによりiCloud Storage内のファイルと同期が取られます。
iCloud Storageにファイルを保存するには、一度ローカルに普通にファイルを書き出したあと、NSFileManagerのsetUbiquitous:itemAtURL:destinationURL:error:メソッドで、iCloud Storage(のキャッシュエリア)にファイルを移動させます。
逆に、ファイルを開くときは、NSMetadataQueryのスコープにNSMetadataQueryUbiquitousDocumentsScopeなどの値を設定して、ファイル検索を行いURLを取得します。
iCloud Storage内には自由にフォルダ(ディレクトリ)を作ることができますが、Documentsフォルダ配下に置いたファイルだけは、システム環境設定のiCloudのストレージ管理で見る事ができます。
iCloud Storageのファイルを取り扱う上で最も大変なのが、ファイルの競合解決です。これに関連して、ファイルは必ずバージョン管理しなくてはなりません。そのために、NSFilePresenterの実装と、NSFileCoordinatorやNSFileVersionの使用は不可欠です。NSDocumentには、これらのものが既に実装されていますが、今回のサンプルコードではNSDocumentを使わずに手動で実装してみました。
なお、iCloud Storageに保存されるのは、現在のバージョンのみなので、歴代のバージョンはそれぞれのデバイスのローカルに保存されるだけで同期されません。
ちなみに、一般的に「クラウドコンピューティング」というものには、インターネット全体を1台の巨大なコンピュータにするという概念があります。インターネット経由でiCloud Storageに接続された各デバイスも、この巨大なコンピュータの一部です。
そのため、実はファイルの同期どころか、ファイルの共有すらしていないことになります。1台のコンピュータが1つのファイルをアクセスしてるだけなので。当然、ファイルの競合など起こるはずがありません。
そういった背景からか、iCloud Storageのドキュメントでは、ファイルの競合は可能な限り静かに解決することが推奨されています。ユーザーに競合の解決を求めるのは最後の手段です。NSDocumentには、この最後の手段が実装されています。