CloudKit
概念
Container (CKContainer)
CloudKit を扱う上で最も上位の概念
CloudKit Dashboard あるいは Xcode 上から、識別用の identifier とともに作成できる
一度作ると削除はできない
保存するデータはもちろん、データ構造定義やアクセスログ等も Container 毎に扱われる
Database (CKDatabase)
データの格納先となるデータベース
スコープ が 3 つある
Public
アプリの全てのユーザがアクセス可能なデータベース
端末が iCloud ログインしていなくても利用できる
全てのユーザがデータを読むことができ、データの生成ユーザのみがデータの書き込み権限を持つ
CloudKit Dashboard で内容を確認でき、権限の付与なども行える
利用にはアプリの iCloud ストレージ容量を消費する
Private
ユーザ固有のデータベース
利用のためには端末にて iCloud アカウントログインが必要
iCloud アカウントを保持しているユーザのみがアクセスでき、全てのデータを読み書きできる
CloudKit Dashboard で内容は確認できない
利用にはユーザの iCloud ストレージ容量を消費する
Shared
特定のユーザ同士がアクセス可能なデータベース
利用のためには端末にて iCloud アカウントログインが必要
アクセスが許可されているユーザのみがアクセスでき、データの読み書きができるかは付与されている権限による
CloudKit Dashboard で内容は確認できない
利用にはユーザの iCloud ストレージ容量は消費しない
iCloud アカウントがアクティベートされていなくても利用できるように設計するのが推奨されている
iCloud アカウントがアクティベート済みかどうかは accountStatus(completionHandler:) を利用する
Zone (CKRecordZone)
データベース内のレコードの名前空間のようなもの
Public/Private Database には各々 default の zone が存在する (Shared Database には存在しない)
同一の Zone に所属する Record 群に対しては Atomic に書き込むことができる
Zone を跨いで Record を参照させあうことはできない
Record (CKRecord)
CloudKit にて格納されるデータ
名前と複数のフィールドを持つ。各フィールドは名前とデータ型を持つ
多分こんな感じ?
https://gyazo.com/bf2aebaaee25b1612ff74f9ce8af451c
==== 以下は WIP ====
気になるやつ。Shared Database の話
https://medium.com/@kwylez/cloudkit-sharing-series-creating-and-querying-records-in-shared-environment-9f5c8e6e1840
table:coredata
Core Data CloudKit
Objects NSManagedObject CKRecord
Models NSManagedObjectModel Schema
Store NSPersistentStore CKDatabase or CKRecordZone
NSManagedObject は、実際にアクセス可能なデータ
CKRecord は KV ストア
NSManagedObjectModel は Xcode 上のモデルエディタで定義する
AppDelegate で NSPersistentCloudKitContainer を初期化する
このコンテナを経由してストアを管理する
PersistentContainer とは?
Setting Up Core Data with CloudKit
登場人物
PersistentContainer
アプリケーション内の CoreData スタックを生成/管理するコンテナ
PersistentStore
データの保存先の抽象化
CoreData は、バイナリ、SQLite、XML、インメモリという4つの保持タイプを持っていて、これらを抽象化して扱うためのクラス
ObjectModel
Object
CloudKit の Schema とデータをやり取りするために、CloudKit に CoreData のデータ構造を教えてやり、Schema を生成する必要がある
Creating a Core Data Model for CloudKit
CloudKit Container については下記
https://developer.apple.com/library/archive/documentation/DataManagement/Conceptual/CloudKitQuickStart/EnablingiCloudandConfiguringCloudKit/EnablingiCloudandConfiguringCloudKit.html#//apple_ref/doc/uid/TP40014987-CH2
TODO
ローカルで完結 & iCloud 利用をスイッチする方法はあるのか?
https://medium.com/apple-developer-academy-federico-ii/syncing-data-on-ios-devices-with-coredata-and-cloudkit-bed296fc26e0
消せないので注意!
https://developer.apple.com/forums/thread/5547
sannkou
https://www.raywenderlich.com/4878052-cloudkit-tutorial-getting-started