【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」にチェックしてください。

Xcodeでプロジェクトを新規作成する方法

チェックを入れて作成したら、以降の手順にて「新規作成の場合実施不要」と記述している箇所についてはスキップしてください

手順1:Signing & CapabilitiesへCloudKitを追加

まずは「Signing & Capabilities」「CloudKit」を追加します。以下手順にしたがって追加してください。

1. 画面左のプロジェクトマネージャーから最上位フォルダのプロジェクト名のファイルをクリックします。

2. TARGETSからプロジェクトを選択します。

3. Signing & Capabilitiesタブをクリックします。

4. +Capabilityをクリックして小ウィンドウを開きます。

5. 検索欄にiCloudと入力し、検索結果からiCloudを選択します。

Signing & CapabilitiesにCloudKitを追加する1

6. Servicesの中からCloudKitにチェックを入れます。

7. 「+」をクリックします。

Signing & CapabilitiesにCloudKitを追加する2

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

Signing & CapabilitiesにCloudKitを追加する3

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

Signing & CapabilitiesにCloudKitを追加する4

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

Signing & CapabilitiesにCloudKitを追加する5

これで手順1:Signing & CapabilitiesへCloudKitを追加は完了です。

手順2:Signing & CapabilitiesへBackground Modesを追加

1〜5. 手順1のCloudKitを追加する手順と同様に「Background Modes」します。

Signing & CapabilitiesにBackground Modesを追加する1

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

Signing & CapabilitiesにBackground Modesを追加する2

これで手順2:Signing & CapabilitiesへBackground Modesを追加は完了です。

手順3:NSPersistentCloudKitContainerへの置換

※手順3は新規作成の場合実施不要です。

次はSwiftコードを修正します。以下手順に従って修正してください。

1. Persistence.swiftを開きます。

2. 「NSPersistentContainer」を「NSPersistentCloudKitContainer」に置換します。

変更前

NSPersistentCloudKitContainerへ置換する(Before)

変更後

NSPersistentCloudKitContainerへ置換する(After)

また、以下のコードを追加してください。

container.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy

以下のコードを画像のように追記すればOKです。

mergePolicyの追加

コードの詳細については以下リンク先を参照してください。

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にチェックを入れます。

Used with CloudKitにチェックを入れる

これで手順4:Used with CloudKitにチェックは完了です。

手順5:CloudKitダッシュボードサイトにアクセス

ここからはXcodeでの作業ではなく、iCloudKitというWebサイトにて作業を行います。

以下画像のように「iCloudKit Console」ボタンを押下してサイトを開き、ログインします。

iCloudKit Console

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

CloudKitダッシュボード

これで手順5:CloudKitダッシュボードサイトにアクセスは完了です。

手順6:CoreDataと同じEntityを作成

次にCloudKit上にXcodeで作成したEntityと紐づけるためのデータを作成します。

1. 「CloudKit Database」を開きます。

CloudKit Databaseを開く

2. 画面上部の「V」のようなアイコンをクリックします。

3. 手順1にて追加したコンテナを選択し、画面上部のコンテナ名が正しいことを確認します。

コンテナを選択する

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

5. 「+」ボタンをクリックします。

Record Typesを開く

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

Record Typeを追加する

7. 画面左のメニューから「Indexes」をクリックします。

8. 先ほど作成したrecord type名と同じ名称のものをクリックします。

Indexesを開く

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

Add Basic Indexを開く

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

Indexの作成

これで手順6:CoreDataと同じEntityを作成は完了です。

手順7:シミュレータからデータが連携されることを確認

次に開発環境(シミュレータなど)で登録したデータがiCloudKitのWebサイト上で表示されることを確認します。

1. 開発環境(iPhoneシミュレータなど)でiCloudアカウントでログインします。

シミュレータで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...をクリックします。

Deploy Schema Changes...の場所

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

デプロイの実施

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

デプロイの結果確認

これで手順8:本番環境にデプロイは完了です。

以上で全ての作業が完了しました。

まとめ

iCloud連携の導入は慣れないと結構めんどくさい。

参考文献・おすすめ文献

Pro iPhone Development with SwiftUI: Design and Manage Top Quality Apps

Apple Developerサイト-Setting Up Core Data with CloudKit

Apple Developerサイト-Build Apps Using CloudKit

Apple Developerサイト-Pushing Background Updates to Your App

Apple Developerサイト-automaticallyMergesChangesFromParent