watchOS Simulator では iCloud に関するシミュレーションが出来ない
「正しくコーディングできているのに、なんで動かないんだろう…?」と思う方もいるかもしれないので、記事として残しておきます。
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 さん どうぞよろしくお願いします……。