CoreDataとCloudKitの自動連携を試してみた

iOS 13から導入されたCoreDataとCloudKitの自動連携を試してみた。

Xcodeの設定

以下の公式ドキュメントがとても参考になった。

https://developer.apple.com/documentation/coredata/mirroring_a_core_data_store_with_cloudkit/setting_up_core_data_with_cloudkit

以下の通り、iCloud, CloudKit, push notifications, remote notificationsをオンにする。

(私はremote notificationsをオンにするのを忘れたため、Cloud連携がうまく動かなかったことがある。)

First, enable iCloud, CloudKit, push notifications, and remote notifications in the background as described in the preceeding sections. Then, replace your persistent container with an instance of NSPersistentCloudKitContainer.

記事の「Manage Multiple Source」のコードは複数のストアを管理する場合に必要な方法で今回は必要ない。

Persistence.swiftは以下の通り。

(プロジェクト作成時に「Host in Cloudkit」にチェックをすればそのままいじる必要はないです。)

CapabilityでCloudKitにチェックをつける。

赤文字のContainersは自分で追加した。

+ボタンの後に、バンドルIDを入力するとiCloud.が先頭に自動的に追加されてコンテナが作成される。

ここで一度アプリをiPhoneで実行、適当にデータを追加してみた。

CloudKit DashBoardについて

次に、上図の少し下の方に「CloudKit DashBoard」ボタンがあるのでブラウザで飛ぶ。

「Schema」の「Record Types」にXcodeのモデルエディタで作ったエンティティがあって少し感動。

「Data」の「Records」でQuery Recordsをするとエラーが発生。

“Field ‘recordName’ is not marked queryable”

https://lyons.app/2021/07/05/how-to-fix-field-recordname-is-not-marked-queryable-in-cloudkit/

上のブログに解決方法が書いてあった。

SchemaでIndexesでIndexを1つ追加する必要があるらしい。(何故だ。)

「recordName」+「QUERYABLE」を追加。

「Data」の「Records」でQuery Recordsを実行。

(PrivateDatabase、com.apple.coredata..、レコードタイプは変更した。)

アプリで追加したデータが表示された!

AppStoreにリリースしたアプリではDevelopmentは使えない

Xcodeで動かしたアプリではうまく動作したのに、AppStoreにリリースしたアプリでうまく連携できないことがあった。

Apps in the App Store can access only the production environment.

https://developer.apple.com/documentation/cloudkit/managing_icloud_containers_with_the_cloudkit_database_app/deploying_an_icloud_container_s_schema

Developmentは開発用のクラウドなので、AppStoreにリリースしたアプリでは使えないようだ。

AppStoreに出す前には忘れずにDeployしよう。