CloudKitについて調べてみた(その2)

※この記事は「その1」の続きです

CloudKitの概要は分かったので使い方を調べていきます。「CloudKit Quick Start」から始めてみます。

スクリーンショット 2020-06-17 16.06.50

CloudKit Quick Start

Quick Startで扱っている内容はこちら。

・Xcode projectのCloudKitを有効にする、プログラムまたはCloudKit Dashboardを使用してスキーマを作成する
・レコードを取得してデータの変更をsubscribeする
・大きなデータやlocationデータに最適化したフィールドタイプの使用
・Storeで公開する前の複数デバイス利用でのCloudKitアプリのテストについて
・スキーマをプロダクションにデプロイする方法、アプリのリリースに合わせて最新の状態にする

Enabling CloudKit in Your App

下記のチュートリアルに沿って進めます。

注意書きに「Apple Developer Programのメンバーシップ」が必要と書いてあります、Developer Programを契約していないユーザでは開発できないのかもしれません。併せて、以下の注意書きが書いてあり、CloudKitを利用する際はアプリの Bundle IDに注意する必要がありそうです。

重要: CloudKitを選択すると、XcodeはバンドルIDに基づいてデフォルトのコンテナーIDを作成します。iCloudコンテナーは削除できないため、CloudKitを選択する前に、Xcodeの「一般」ペインでバンドルIDが正しいことを確認してください。バンドルIDを変更するには、アプリの配布のクイックスタートでバンドルIDを設定するをご覧ください。

プロジェクト作成、iCloud有効化、コンテナ作成

早速Xcodeでプロジェクトを作成します。「Signing & Capabilities」の画面から「Capability」をクリックします。

スクリーンショット 2020-06-17 20.20.59

「iCloud」と入力してiCloudを追加します。

スクリーンショット 2020-06-17 20.21.40

ドキュメントでは

Key-Valueストレージはデフォルトで有効になっています。

と書いてありますが、実際にやってみたところ Key-Value ストレージはチェックが入っていませんでした。手動でチェックを入れます、その下にあるCloudKitにもチェックを入れいます。

スクリーンショット 2020-06-17 20.22.41

ドキュメントではデフォルトのコンテナが作成されて選択された状態になっていますが、手元の画面では出てきません。

スクリーンショット 2020-06-17 20.18.17

検索したところ stack overflow に以下の記事が出てきました。

This changed in Xcode 11, there no longer is a default container checkbox.Instead you have to create your own container. Just press the + and enter your bundle-id. Xcode will automatically prefix it with iCloud.So the result will be iCloud.<your app’s bundle ID>, the same as the default Xcode used previously.

どうやら Xcode 11 からデフォルトコンテナは作られなくなったようです。

+ボタンを押してコンテナ追加画面を表示します。

スクリーンショット 2020-06-17 20.34.16

コンテナ名の入力画面が出るのでアプリのBundle Identiferを入力します。Bundle Identifier じゃなくても良いと思いますが昔の仕様ではデフォルトコンテナはBundle Identifierの名前で作られていたので今回はそれに合わせることにします。

OKを押すと先程入力した名前に iCloud. というprefixが付いたコンテナが作成されました。

スクリーンショット 2020-06-17 20.36.51

この状態でCloudKit Dashboardをのぞいてみます、先ほど作成したコンテナが表示されています。DevelopmentとProductionの二つに分かれているようです。

スクリーンショット 2020-06-17 20.39.26

レコードとスキーマの作成

開発中は、CloudKit APIを使用してスキーマを簡単に作成できます。レコードオブジェクトをデータベースに保存すると、関連するレコードタイプとそのフィールドが自動的に作成されます。この機能はジャストインタイムスキーマと呼ばれ、ストアで販売されているアプリからアクセスできない開発環境を使用する場合にのみ使用できます。たとえば、開発中に、プロパティリストに保存されているテストレコードをCloudKitデータベースに入力できます。

開発用データベース(Developmentのこと)であればコードを書いてオブジェクトを保存するだけで勝手にスキーマが作られるそうです。サンプルコードを参考にCKRecordのオブジェクトを作成します。

let artworkRecordID = CKRecord.ID(recordName: "115")
let artworkRecord = CKRecord(recordType: "Artwork", recordID: artworkRecordID)
artworkRecord["title"]   = "MacKerricher State Park" as NSString
artworkRecord["artist"]  = "Mei Chen"                as NSString
artworkRecord["address"] = "Fort Bragg, CA"          as NSString

生成したオブジェクトをパブリックデータベースを指定して保存する。


// To get the public database:
let myContainer = CKContainer.default()
let publicDatabase = myContainer.publicCloudDatabase

// Save
publicDatabase.save(artworkRecord) {
   (record, error) in
   if let error = error {
       print(error)
       // Insert error handling
       return
   }
   // Insert successfully saved record code
}

上記のコードが正常に実行されたのでsaveできたはず、Dashboard を確認します。Development => Data からQeury Recordsを実行してみるもエラー。

スクリーンショット 2020-06-19 19.10.48

エラーメッセージでググるとdeveloper forumの記事が出てくる。

https://developer.apple.com/forums/thread/79126

In the Dashboard:
1) Select your container. Then choose "Schema".
2) In the sidebar select the record you want.
3) With the record selected in the sidebar you should see a list of "System fields" and "Custom fields". Scroll to the bottom and click the "Edit Indexes."
4) You'll now see a pop up button appear in the "Fields" column. Choose "recordName" (if it isn't already selected in the pop up button) then choose "Queryable" in the pop up button in the "Index Type" column. Click "Add Index".
5) Click "Save Changes" to save.

Schemaの画面からrecordNameに"Queryable"をセットすれば良いと書いてあるのでその通りに実行。

スクリーンショット 2020-06-19 19.13.22

よくみるとチュートリアルにも書いてあった。

Enable RecordName Indexes Before Viewing Records
All the metadata indexes for record types created using just-in-time schema are disabled by default. The recordName query index needs to be enabled to view the associated records in CloudKit Dashboard.

「ジャストインタイムスキーマを使用して作成されたレコードタイプのメタデータインデックスはデフォルトで無効になっているので、Dashboardでレコードを表示するにはrecordNameクエリインデックスを有効にする必要がある」とのこと。

インデックスを追加した後に改めて確認するとレコードが表示された!

スクリーンショット 2020-06-19 19.24.59

まとめ

Developmentのデータベースにデータを保存するところまでできた。次はアプリからデータの取得を試してみようと思う。


この記事が気に入ったらサポートをしてみませんか?