iOS13からお手軽にCloudKitを使えるらしい
らしいですね。先人に感謝!
iOS / iPadOS 13からCore DataとCloudKitの連携が自動化されたということで試してみた
実に興味深い。ぼくもやる。
これまで作ってきたCoreDataのサンプルをCloudKitに対応させてみよう
例によって、プロジェクト新規作成時点ではなく中途採用方式で行きましょう。
私、実は過去にCloudKitを使ってみようとして断念(挫折)しております。
言い訳は申しません。丸坊主のチャンスの神様にうっすら毛が生えたんです。今むしらねばいつむしるのか。
ちなみに、効果があるのはリ○ップでしょうか?カン○ロ○でしょうか?ぜひ教えて下さい。
ともかくまずは動くかどうかは置いておいて、猪突猛進で参ります。
コーディングのお供はFF7実況プレイ動画です。レッド13のみで進める縛りプレイ良き。戦闘不能時のケットシー、よく見るとにゃんこ(本体)がモーグリぬいぐるみの上でくたばってる。
CapabilityでiCloudを有効にする
TARGETS
からSigning & Capabilities
を選択しiCloud
を追加します。


使いたいサービスはCloudKit
なのでそれにチェックを入れます。

お目当てのコンテナは……無いですね。何かごちゃごちゃ入っていますが、過去の挫折で生じた遺物です。

コンテナ作りましょう。+ボタンを押しますと何やらダイアログが出ました。

なるヘそ。わかりません。iCloud.
に続けてアプリのBundle Identifierを入れろということですね。多分。entitlements
ファイル名と同じ名前にしておいたほうが良さそうです。
入力しOKボタンを押すと、何やら証明書の確認処理が走った後、コンテナ名が赤字表示されました。多分アウト。
+ボタン横の丸矢印ボタンをクリックしてみます。すると白文字(ダークモードなので)になりました。多分OK。
iCloud(Debug)とiCloud(Release)が勝手に出てくるため、両方とも赤字が無いようにします。
ちなみにですが、赤字の項目がなくなるとiCloud一つに戻りました。
このあたりをエイヤッとやってしまったのでスクショは撮ってないです。不覚。
なんとなく丸く収まった感じなので、良しとしましょう
コンテナをCloudKitに対応させる
CloudKitを使わないこれまでのケースで使ってきたクラスはNSPersistentContainer
でした。これが、CloudKitを使うときはNSPersistentCloudKitContainer
に変わります。
該当箇所を単純に書き換えましょう(置換しましょう)。
Data ModelをCloudKitに対応させる
xcdatamodeld
ファイルを開き、右ペインを見ると、Used with CloudKit
という項目があるようです。
ありました!チェックを付けます。

このとき、Optionalで無いフィールドには初期値を設定しておかなければなりません。エラーが出たら、逐次処理してください。
おしまい!!?
見た感じこれぐらいのようです。
CloudKitを使わないパターンでごそりごそりと作り続けていたこともありますが、ちょっと拍子抜け。
本当に動くのか?
iOS13(iPadOS13)にアップデートした端末を2台用意します。両方で同じiCloudアカウントにログインしておきます。そしてアプリを導入します。
ついでに、いつInsertしたかわかるようにしておきました。日付が出てくるようにしただけです。
最初は果物データが入っているだけです。片方でInsertしてもう一方でFetchしてみます。これで果物が出なければ成功です!
まず、果物データの状態でInsertボタン→Fetchボタンの順で押す。

これがもう一方で表示されればOK!
それにしても「タイトルだよ〜」って、我ながらセンスが無い。
ワクワクしながらもう一台を操作。
最初は果物データ。

Fetchボタンを押します。

まとめ
iOS13以降限定ですが、とってもお手軽にCloudKit対応できることが分かりました。iOS12もかなりのシェアを占めていると思いますので、当面メインの手法とはいかないと思います。ですが、今後のことを考えて、手法の一つとしていかがでしょうか?
慣れてきたら、最初からCoreDataとCloudKitを使う前提でプロジェクトを作っておけばいいと思います。でも、慣れるまでは、CoreDataなし→CoreDataあり(CloudKitなし)→CoreDataあり(CloudKitあり)と、段階を踏んで実践してみるとても面白いと思います。
なお、Cloudkit Dashboardからもデータが見れますが、ここまでで同期したデータはログインしているiCloudアカウントでのみ確認できるようです。
別のアカウントでログインしたためデータが現れず、しばらく悩んだのは内緒。
疑問点メモ
共有データのこと
このデータ保存はアカウントごとで区切られているように見えます。ならば、例えばグループや不特定多数などに公開する共有データというのはiCloudで実現できないんでしょうかね?多分できそうですよね。
リアルタイム同期
ある端末でデータを更新したら他の端末にゾワゾワっと反映されたら楽しい。Macのアプリと連携するときなど便利そうです。
謎のログ
エラーっぽい表示ではないけれどもつらつらと表示されるログ情報が気になる。これは要調査。