まとーか鈴木

千の姿と千の技と千の風

iCloud設計ガイドでキー値ストレージの使用方法を調べてみた

iCloudのキー値ストレージを使うために設計ガイドを読んで調べてみた。

iCloud設計ガイド
https://developer.apple.com/jp/devcenter/ios/library/documentation/iCloudDesignGuide.pdf

読んでわかったことを書いてく。


用意はこんな感じ。

  1. デベロッパセンターでアプリのiCloud設定にチェックをつけてEnableにする
  2. プロビジョニングファイルを作りなおす
  3. プロジェクト設定で上記プロビジョニングファイルを指定する。(Team ProvisioningProfileじゃダメ)
  4. ターゲット設定のcapabilityでiCloudをONにする
  5. Use Key Value Storeにチェックを付ける
  6. Ubiquity Containerの欄のbundleIDと合成された識別子はドキュメントストレージを使わなければ削除


これで環境的な設定は完了。

ドキュメントを読み進めていくと、iCloudを使うにはubiquityIdentityTokenが必要だって書いてある。

iCloudを利用するようアプリケーションを準備する

  • iCloudが使えるかどうか、NSFileManagerのubiquityIdentityTokenメソッドで確認します
  • サインイン中のユーザが機内モードに切り替えると、iCloudにはもちろんアクセスできなくなりますが、アカウントはサインイン状態のままなので、ubiquityIdentityTokenメソッドは当該アカウントに対応するトークンを返します。
  • 「Settings」で「Documents & Data」をオフにするなどしてiCloudからサインアウトすると、ubiquityIdentityTokenメソッドはnilを返すようになります。

この後は暫くドキュメント系の話が続くので、一気にキー値ストレージのページまで移動。

iCloud上でキー値データを管理するための設計

  • アプリケーションはキー値ストレージに共有NSUbiquitousKeyValueStoreオブジェクトを使ってアクセスします。
  • NSUbiquitousKeyValueStoreDidChangeExternallyNotification通知を受け取るよう登録する必要があります。

オッケーここまでくれば、イメージは掴めた!
この段階での設計思案。

  1. トークン取得
  2. トークンが取れればキー値ストレージに値を保存
  3. トークンが取れなかったらキー値ストレージの参照も取れないって事でエラー処理!

って感じで、
この時はiCloudサインアウト状態だと
NSUbiquitousKeyValueStoreはnilで返ってくるんだろう!と思ってた。

NSUbiquitousKeyValueStore* kvStore = [NSUbiquitousKeyValueStore defaultStore];

しかし、kvStoreの値を見てみると、nilではなくアドレスがしっかり入ってる!!

ということは、
iCloudサインイン状態に関係なくNSUbiquitousKeyValueStoreにはアクセス出来そうだ。

でも、サインアウト時に保存した値はいつ使われるのか?
そもそも保存出来ているのか?と疑問が出てきたのでアプリを動かして確かめてみた。

サインアウト中の書き込み

f:id:matouka_suzuki:20131212010429p:plain
サインアウトしてても値は保存されている様だ。

サインアウト中に書き込んだ値はサインインによって使われるか

f:id:matouka_suzuki:20131212011719p:plain
サインアウト中に書き込んだ値は、次のサインイン時に使用されていた。

iCloud同期前にアプリを消したらNSUbiquitousKeyValueStoreの値はどうなるか

ユビキティコンテナ、iCloudストレージ、エンタイトルメント

アプリケーションは、iCloudにデータを保存しなければならないとき、ユビキティコンテナという特別なファイルシステムにそのデータを置きます。
ユビキティコンテナとは、iCloudストレージの特定の部分を、デバイス上に(ローカルに)再現したもののことです。アプリケーションのサンドボックスコンテナとは別の領域です

設計ガイドの最初の方に"アプリのサンドボックスとは別領域"って記載があったので、
keychainみたいに残るのかと思ったけど、アプリ削除したら値は消えてた。
キー値ストレージはアプリ内にあるって事かな。

動きがわかったので、設計出来そう。