【Core Data】
iCloudにデータを連携する方法
iCloudにデータを残して端末変更してもデータを引き継ぐ
投稿日 2022/07/18 更新日 2022/07/18

こんにちは。当サイトの管理者「元木皇天」です。
今回はiOS向けのデータベースCore Dataのデータを、iCloudに連携して他の端末に変更したり、アプリを削除してもデータを残しておく方法について解説いたします。
環境
OS:MacOS Big Sur ver11
Swift:バージョン5.5.2
Xcode:バージョン13.2.1
参考文献
目次
はじめに
前提として、今回の手順の説明は以下の開発者を対象としています。
・新規でプロジェクトを作成してCoreDataとiCloud連携を導入したい人
・既にCoreDataプロジェクトを作成済みでiCloud連携を導入したい人
新規でプロジェクトを作成する場合、以下のように「UseCore Data」「Host in Cloud」にチェックしてください。

チェックを入れて作成したら、以降の手順にて「新規作成の場合実施不要」と記述している箇所についてはスキップしてください。
手順1:Signing & CapabilitiesへCloudKitを追加
まずは「Signing & Capabilities」に「CloudKit」を追加します。以下手順にしたがって追加してください。
1. 画面左のプロジェクトマネージャーから最上位フォルダのプロジェクト名のファイルをクリックします。
2. TARGETSからプロジェクトを選択します。
3. Signing & Capabilitiesタブをクリックします。
4. +Capabilityをクリックして小ウィンドウを開きます。
5. 検索欄にiCloudと入力し、検索結果からiCloudを選択します。

6. Servicesの中からCloudKitにチェックを入れます。
7. 「+」をクリックします。

8. ウィンドウが開き入力を求められるので、「iCloud.Bundle Identifierの文字列」(以下補足参照)を入力してOKを押します。

補足:Bundle Identifierの文字列確認。

9. 追加されたことを確認し「更新ボタン」を押下します。(まれに赤字で表示されてしまうことがあるので、その場合は再度更新ボタンを押してください)

これで手順1:Signing & CapabilitiesへCloudKitを追加は完了です。
手順2:Signing & CapabilitiesへBackground Modesを追加
1〜5. 手順1のCloudKitを追加する手順と同様に「Background Modes」します。

6. Remote notificationsにチェックを入れます。

これで手順2:Signing & CapabilitiesへBackground Modesを追加は完了です。
手順3:NSPersistentCloudKitContainerへの置換
※手順3は新規作成の場合実施不要です。
次はSwiftコードを修正します。以下手順に従って修正してください。
1. Persistence.swiftを開きます。
2. 「NSPersistentContainer」を「NSPersistentCloudKitContainer」に置換します。
変更前

変更後

また、以下のコードを追加してください。
container.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
以下のコードを画像のように追記すればOKです。

コードの詳細については以下リンク先を参照してください。
Apple Developerサイト-automaticallyMergesChangesFromParent
これで手順3:NSPersistentCloudKitContainerへの置換は完了です。
手順4:Used with CloudKitにチェック
※手順4は新規作成の場合実施不要です。
次にiCloud連携する対象のEntityを設定します。
1. 画面左のプロジェクトマネージャーから.xcdatamodeldファイルをクリックします。
2. 「CONFIGURATIONS」からiCLoud連携したいEntityが入っている設定を選択します。(以下例ではDefaultを選択)
3. 右のインスペクターからData Modelインスペクターを開きます。
4. Used with CloudKitにチェックを入れます。

これで手順4:Used with CloudKitにチェックは完了です。
手順5:CloudKitダッシュボードサイトにアクセス
ここからはXcodeでの作業ではなく、iCloudKitというWebサイトにて作業を行います。
以下画像のように「iCloudKit Console」ボタンを押下してサイトを開き、ログインします。

ログインすると以下のようなダッシュボードのページが開かれると思います。

これで手順5:CloudKitダッシュボードサイトにアクセスは完了です。
手順6:CoreDataと同じEntityを作成
次にCloudKit上にXcodeで作成したEntityと紐づけるためのデータを作成します。
1. 「CloudKit Database」を開きます。

2. 画面上部の「V」のようなアイコンをクリックします。
3. 手順1にて追加したコンテナを選択し、画面上部のコンテナ名が正しいことを確認します。

4. 画面左のメニューから「Record Types」をクリックします。
5. 「+」ボタンをクリックします。

6. Xcodeで作成したEntityをRecord Typesに「CD_Entity名」で作成し、SAVEボタンをクリックします。(例:Entity名が「User」の場合、「CD_User」という名称で作成する)

7. 画面左のメニューから「Indexes」をクリックします。
8. 先ほど作成したrecord type名と同じ名称のものをクリックします。

9. Add Basic Indexをクリックします。

10. Fieldに「recordName」、Index Typeに「Queryable」を設定し「Sava Changes」ボタンをクリックします。

これで手順6:CoreDataと同じEntityを作成は完了です。
手順7:シミュレータからデータが連携されることを確認
次に開発環境(シミュレータなど)で登録したデータがiCloudKitのWebサイト上で表示されることを確認します。
1. 開発環境(iPhoneシミュレータなど)でiCloudアカウントでログインします。

2. CoreDataにデータを登録します。(今回登録するデータは以下のような感じです。少し誤字りました。。)

3. 画面左のメニューから「Records」をクリックします。
4. 検索条件を以下のようにして「Query Records」ボタンをクリックします。
・Private Databaseを選択
・com.apple.coredata.cloudkit.zoneを選択
・Query Recordsを選択
・今回作成したRecord Typeを選択
・Allを選択
登録したデータが表示されればOKです。

これで手順7:シミュレータからデータが連携されることを確認は完了です。
手順8:本番環境にデプロイ
ここまでくればあと少しです。
最後に、開発環境で作成した内容を本番環境にデプロイします。
(この作業を行わないと、本番環境に反映されないので忘れず行うようにしてください。)
1. 画面左のメニューからDeploy Schema Changes...をクリックします。

2. デプロイ内容が表示されます。確認してOKであれば「Deploy」ボタンを押下します。

3. 画面左のメニューから「Production」をクリックし、開発環境の内容が反映されていることを確認できればOKです。

これで手順8:本番環境にデプロイは完了です。
以上で全ての作業が完了しました。
まとめ
iCloud連携の導入は慣れないと結構めんどくさい。