2018年3月3日土曜日

CloudKit(1): DatabaseとRecord

CloudKit でどこまで何ができるのか? を理解するため、実際に試してみた。
私が知りたかったことを中心に何回かに分けて書いてみます。
今回はDatabaseとRecordについて。

Database



Database は、Public, Private, Shared の3つある。
Public は一般公開用、Private は個人用、Shared は個人同士で共有できるもの。
開発者であっても、各個人のPrivate , Shared DBの中身は見ることはできない。

Appleのアプリで利用している例を見るのがわかりやすい。
いや、逆に、これらのアプリで利用することを目的に設計されていると考えてもいいと思う。

設計次第かもしれないが、ソーシャルゲームのようなものは向いていないと思う。

CloudKitのメリットは、アカウント管理しなくても各デバイスに同期させることができたり、個人情報や健康情報などのセキュアな状態にすべき情報を自社サーバーにもたなくてもいい ということ。
なので、ツール系アプリが合っているのかもしれない。

ただ、ユーザがCloudKitを使わない設定にすることが可能なので、Private DBをメイン機能として使うのは難しい。(iCloudを設定していないアカウントでもPublicはいつでも利用可能らしい)



Price

Privateは利用ユーザのiCloudに保存され、PublicはアプリのiCloud Storageに保存される。



このFreeのStorage容量はPublicのものと思うが、Data transfer, Requests per sec はPublicだけなのか、Privateなども含むのか、いまいちはっきり分からない。

CloudKit Dashboard にて Data transfer,  Requests per sec のグラフが見えるのはPublic だけなのと、Apple Developer Forum でのAppleの人が

Private database storage goes against the user’s account quota and they pay for that. Data transfer from public to private will cost the user.  Data transfer from private to public will cost the developer. 
...といっているので、Public だけ という認識でOKな気も。多分。
だとすると、Publicを使わなければ開発者側は完全無料ということか。


Record

データはCKRecordで保存する。
最初にRecordを保存した際、そのレコードの情報が型としてiCloudに保存される。
上記の場合、"MyType" という Record Type、その属性としてtitle, price が登録される。
確認、変更は iCloud Dashboard から行える。

保存出来るデータ型は以下が利用可能。
  • NSString
  • NSNumber
  • NSData
  • NSDate
  • NSArray
  • CLLocation
  • CKAsset : 画像など
  • CKReference : Recordの親子関係を設定
Recordで保存するデータ量は1MBを超えてはいけない。

CKRecordにはsystemFieldがあり、iCloudからfetchしたRecordにはsystemFieldが設定されている。
systemFieldが含まれているRecordを登録すると更新(Update)になり、systemFieldが空だと新規追加(Insert)になる。
systemFieldを encodeSystemFields(with:) でDataにしてローカルに保存が可能。


Record Zone



DatabaseにはRecord Zoneがあり、その中にRecordが保存される。
Zone指定でSubscription(変更通知)を登録したりする。

Default Zone は名前通り最初からあるデフォルトのZone。Custom Zone は自由に作成できるZone。



注目すべきところは、Public にはDefault Zone のみ、Shared には Shared Zone のみ存在できるということ。

Shareするためには、Custom Zone である必要がある。(Default Zone は Share できない)
Aさんが 「Private DB : Custom Zone」 を BさんにShareすると、Bさんには 「Share DB : Shared Zone」 が自動的に作成される。
ShareしたAさんの 「Private DB : Custom Zone」 は変わらずPrivateのまま。Sharedになるわけではない。
※厳密には、Shareは(Root)Recordを指定する

どんな単位で Zoneを使うとよさそうか? を考える際には、Share を使うかどうか というのも重要な要素になるということ。




次回は、Operation について書いてみます。
その後は、Subscription、Share などについて書いていく予定。


• • •