CoreDataを使用しているプロジェクトにCloudKitを追加する方法

この記事は約5分で読めます。

CoreDataを使用しているプロジェクトに後からCloudKitを連携させるケースを紹介しています。

「Signing & Capabilities」の設定

最終的には以下のような設定となります。順番に設定箇所を説明していきます。

Signingの設定必要箇所

赤枠で示す以下の3箇所を設定してください。
設定したら画面左上の”+”を押してcapabilities画面を表示します。

  • Automatically manage signing:✔️(チェックする)
  • Team:Apple Developerアカウントとして登録したアカウントを設定します
  • Bundle Identifier:プロジェクト作成時に設定した識別子。Generalにも設定されています

capabilities画面で機能を追加

フィルタ欄に「icloud」と入力し、クリックします

iCloudの設定必要箇所

capabilities画面でiCloudを追加すると以下の設定項目が表示されます。

  • CloudKit:✔️(チェックする)

Containersの“+”ボタンを押してContainerを追加します。

Containersの追加

Containerの追加画面において名称を記入します。
名称は「iCloud」+「Bundle identifierの値」を記入します。

本記事の例では以下の名称となります。

iCloud.myname.CoreDataSample

以上でiCloudの設定が完了です。赤文字でエラーが発生していたりする場合は、更新ボタンを押すと解除されることがあります。

xcdatamodelの設定変更

CoreDataのxcdatamodelファイルでCloudKitを使用する設定を行います。
赤枠の「Default」を押すとConfiguration欄に「Used with CloudKit」が表示されるためチェック(✔️)します。

Persistence.swiftの修正

Persistence.swiftのコード中間あたりにNSPersistentContainerの記述が2箇所見つかるかと思います。
NSPersistentCloudKitContainer」に置き換えます。

赤枠の2箇所です。行番号はコードによって前後するかもしれません。

動作確認方法

シミュレーターの場合、設定->サインインでapple IDにサインインする

データモデルが反映されているか確認

CoreDataを使用したデータの保存・取得処理が実装できていることが前提です

シミュレーターでCoreDataへの保存処理を動作させると、CloudKitの画面へデータが反映されるため確認します。

確認方法

CloudKItのダッシュボード画面を表示します。
ダッシュボードでCloudKit Databaseを選択します。

“Schema” → “indexes”と選択していくと、CoreDataで構築したデータモデルが設定されていることが確認できます。

ちなみに保存処理などを行わない状態でCloudKitの画面を確認すると何も設定されていないまっさらな状態になっています。

なおCoreDataの保存処理を行わずに、CloudKitの画面を確認すると何も設定されていないまっさらな状態になっています

データの保存が動作しているか確認

次はCoreDataの保存が動作しているか確認していきます。

事前の準備

まず準備としてrecordNameの設定が必要になります。
“Schema” → “indexes”と選択していき確認したいエンティティ名を選択します。

コアデータから保存した場合は「CD+エンティティ名」となっています

以下の画面ではrecordNameを既に追加済みですが、『Add Basic Index』を押してFIELDとINDEX TYPEを設定します。

設定内容は以下の通りです。

  • FIELD:recordName
  • INDEX TYPE:QUERYABLE
確認方法

CloudKitのメニュー欄から“Data” → “Record”と選択します。

表示するレコードを以下の通り設定します。最後に画面右側の『Query Records』ボタンを押します。

  • Databaseの選択:Private Database
  • Zone:com.applecoredata.cloudkit.zone
  • 操作の種類:Quary Records
  • RECORD TYPE:表示したいエンティティ名

CoreDataで保存していたデータがCloudKitに保存されていることが分かります。

データを確認する際に事前準備で説明したrecordNameを設定しておかないと、「Field ‘recordName’ is not marked queryable」というエラーが表示されて、データが表示されません。

データが表示されない場合

データが表示されない場合、データの反映にタイムラグ?が発生している場合があります。
少し時間が経つと反映されることがあります。

XcodeのBackground Modesという設定項目で「Remote notifications」を有効にすると即時反映されているようです。(検証中)

タイトルとURLをコピーしました