MagicalRecordでiCloudを使う


MagicalRecordでiCloud使うのが大変だったのでメモ。つーかMagicalRecordのバグだなこれ(#749, #787)。

手順

Devleoper CenterでAppの設定

Identifiers -> App IDsから任意のアプリを選択してiCloudを有効にする。

CapabilitiesでiCloudの設定

Servicesは iCloud Documents を選択。Containerは Use default container を使います。

CloudKitをリンクする

CoreDataスタックを初期化する

MagicalRecordでiCloudを利用するように初期化する。iCloudを含めて初期化するメソッドはいくつかあるが MagicalRecord:setupCoreDataStackWithiCloudContainer:contentNameKey:localStoreNamed:cloudStorePathComponent:を使う。ちなみにMagicalRecord:setupCoreDataStackWithiCloudContainer:localStoreNamed:は使えませんでした。

// このメソッドは使えない
//[MagicalRecord setupCoreDataStackWithiCloudContainer:@"iCloud.com.example.Example"
//                                     localStoreNamed:@"Example"];

// こっちを使う
[MagicalRecord setupCoreDataStackWithiCloudContainer:@"iCloud.com.example.Example"
                                      contentNameKey:@"Example"
                                     localStoreNamed:@"Example.sqlite"
                             cloudStorePathComponent:nil];

同じアプリを複数のデバイスにインストールして確認する

同じアプリを複数のデバイスにインストールしてデータを更新します。もう一方のデバイスでアプリを立ち上げると、同じデータがコピーされます。タイミング等はよくわからない。

MagicalRecordのバグ?

MagicalRecord:setupCoreDataStackWithiCloudContainer:localStoreNamed:は最初の引数にiCloudコンテナIDを渡す。内部的にPFUbiquitySetupAssistantクラスを呼び出してオプションとしてコンテナIDを渡すのだが、PFUbiquitySetupAssistantのオプションはピリオドを受け付けないのでエラーになる。

MagicalRecord:setupCoreDataStackWithiCloudContainer:contentNameKey:localStoreNamed:cloudStorePathComponent:は直接コンテナ名を渡すことが出来るのでこちらで代用している。

MagicalRecordのバグのようなので将来的には修正されるかもしれない(チケット無かったら上げておきます)。

参考