iCloud設計ガイドでキー値ストレージの使用方法を調べてみた
iCloudのキー値ストレージを使うために設計ガイドを読んで調べてみた。
iCloud設計ガイド
https://developer.apple.com/jp/devcenter/ios/library/documentation/iCloudDesignGuide.pdf
読んでわかったことを書いてく。
用意はこんな感じ。
- デベロッパセンターでアプリのiCloud設定にチェックをつけてEnableにする
- プロビジョニングファイルを作りなおす
- プロジェクト設定で上記プロビジョニングファイルを指定する。(Team ProvisioningProfileじゃダメ)
- ターゲット設定のcapabilityでiCloudをONにする
- Use Key Value Storeにチェックを付ける
- Ubiquity Containerの欄のbundleIDと合成された識別子はドキュメントストレージを使わなければ削除
これで環境的な設定は完了。
ドキュメントを読み進めていくと、iCloudを使うにはubiquityIdentityTokenが必要だって書いてある。
iCloudを利用するようアプリケーションを準備する
- iCloudが使えるかどうか、NSFileManagerのubiquityIdentityTokenメソッドで確認します
- サインイン中のユーザが機内モードに切り替えると、iCloudにはもちろんアクセスできなくなりますが、アカウントはサインイン状態のままなので、ubiquityIdentityTokenメソッドは当該アカウントに対応するトークンを返します。
- 「Settings」で「Documents & Data」をオフにするなどしてiCloudからサインアウトすると、ubiquityIdentityTokenメソッドはnilを返すようになります。
この後は暫くドキュメント系の話が続くので、一気にキー値ストレージのページまで移動。
iCloud上でキー値データを管理するための設計
- アプリケーションはキー値ストレージに共有NSUbiquitousKeyValueStoreオブジェクトを使ってアクセスします。
- NSUbiquitousKeyValueStoreDidChangeExternallyNotification通知を受け取るよう登録する必要があります。
オッケーここまでくれば、イメージは掴めた!
この段階での設計思案。
- トークン取得
- トークンが取れればキー値ストレージに値を保存
- トークンが取れなかったらキー値ストレージの参照も取れないって事でエラー処理!
って感じで、
この時はiCloudサインアウト状態だと
NSUbiquitousKeyValueStoreはnilで返ってくるんだろう!と思ってた。
NSUbiquitousKeyValueStore* kvStore = [NSUbiquitousKeyValueStore defaultStore];
しかし、kvStoreの値を見てみると、nilではなくアドレスがしっかり入ってる!!
ということは、
iCloudサインイン状態に関係なくNSUbiquitousKeyValueStoreにはアクセス出来そうだ。
でも、サインアウト時に保存した値はいつ使われるのか?
そもそも保存出来ているのか?と疑問が出てきたのでアプリを動かして確かめてみた。
サインアウト中の書き込み
サインアウトしてても値は保存されている様だ。
サインアウト中に書き込んだ値はサインインによって使われるか
サインアウト中に書き込んだ値は、次のサインイン時に使用されていた。
iCloud同期前にアプリを消したらNSUbiquitousKeyValueStoreの値はどうなるか
設計ガイドの最初の方に"アプリのサンドボックスとは別領域"って記載があったので、
keychainみたいに残るのかと思ったけど、アプリ削除したら値は消えてた。
キー値ストレージはアプリ内にあるって事かな。
動きがわかったので、設計出来そう。