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