watchOS Simulator では iCloud に関するシミュレーションが出来ない

Apple, CloudKit, プログラミング

「正しくコーディングできているのに、なんで動かないんだろう…?」と思う方もいるかもしれないので、記事として残しておきます。

watchOS Simulator では iCloud に関するシミュレーションが出来ない

Xcode に付属する iOS、watchOS、tvOS の Simulator ですが、watchOS に関して iCloud に関係するシミュレーションは出来ません。

ここでいう iCloud に関係するシミュレーション とは次の2つです。

  • iCloud キーチェーン
  • CloudKit

環境

  • Xcode Version 10.2.1 (10E1001)
  • Simulator Version 10.2.1 (SimulatorApp-880.5 CoreSimulator-587.35)
  • watchOS 5.2

iCloud キーチェーン

iCloud キーチェーンは iOS、macOS、watchOS、tvOS のキーチェーンを iCloud で同期するというものですが、シミュレーションどころか実機でも watchOS では iCloud キーチェーンが使用できません。

キーチェーンを iCloud で共有するために使用する kSecAttrSynchronizable のドキュメントを見ると、iOS 7.0+ macOS 10.9+ tvOS 9.0+ watchOS 2.0+ で有効というように書かれており、WatchKit Extension にて kSecAttrSynchronizable を記述してもエラーなどは表示されず実行されるのですが、App Programming Guide for watchOS を見ると

とあり、watchOS に対してキーチェーンが iCloud で共有されることはありません。

CloudKit

CloudKit は watchOS で(おそらく)唯一使うことのできる BaaS です。

私も趣味のプロジェクトで iCloud キーチェーンによるデータの共有が出来ないとわかり、代替方法としてこの CloudKit を使うようにコーディングしています。

しかし、watchOS Simulator で CloudKit – アカウントの状態を確認する でも紹介した CKContainer.accountStatus(completionHandler:) を使って iCloud アカウントの確認をしようとしたところ、

というように、 CKAccountStatus.noAccount を示してしまって iCloud のアカウントが設定されていないと返してきます。

ペアリングしてある iOS の Simulator のほうはちゃんと iCloud にサインインしており、そちらでは CKAccountStatus.noAccount を示すことはありません。実機の場合でも Apple Watch とペアリングしている iPhone が iCloud にサインインしていれば、Apple Watch 側でも CloudKit に接続することが出来ます。

CloudKit だけでも Simulator で使わせてほしい…

CloudKit の動作確認のためだけに実機の Apple Watch でデバッグしなければならないのは非常に骨が折れます…。以前と比べて Apple Watch のデバッグにかかる時間の早さは改善されているとはいえ、やはり Simulator によるデバッグのほうが簡単なのは事実です。

来る WWDC19、Apple さん どうぞよろしくお願いします……。