ManagedSettingsStoreを使う際のTips
簡単なTipsです。ManagedSettingsStoreを使ったコード書きたいと思ったときに注意すべき点がいくつかあるので紹介します.
1. トークンのテストはnilかどうかだけチェック
ManagedSettingsStore.shield.applications
などにトークンを設定することでシールドが表示できますが、このトークン(ApplicationToken
, WebDomainToken
, ActivityCateogoryToken
)はプライバシー保護のためイニシャライザがpublicになっておらず、開発者から初期化することはできません。しかしapplications = .init()
のように空Setを設定することは可能です。ラッパーAPIを書いていてテストしたい場面でも、XCTAssertEqual
ではなくXCTAssertNotNil
を使うようにしてください。空Setが設定されている場合は非nilなので、テストをパスできます。
2. 認可していないシミュレーターだとテストに失敗する
FamilyControls.AuthorizationCenter
で認可を出したデバイスじゃないとManagedSettingsStoreへの設定が効かない(適応されない・保存されない)ので、XCTestで失敗することがあります。この挙動はCI・CDでの自動テストと相性がすごく悪いです。(ローカルテストだとシミュレーターを自分で弄って認可を通してから自動テスト実行できるので良いですが)
シミュレーターのScreen Timeの認可ではパスワードを要求されるのですが、シミュレーターなので空文字でなければ認可をパスします。
ローカルでテストを行う際は、TestPlanでの自動テストの実行設定がパラレルになっていると新しいシミュレーターが起動されてしまうため気をつけてください。
並列実行設定をオフにしておくと良いでしょう。
CI・CDでその辺りのテストをスキップしたい場合は、テストプランで該当のテストだけ含めないようにしたり、XCTSkipIfを活用すると良いでしょう。
3. Capabilityの追加を忘れないように
たとえFamilyControls.AuthorizationCenter
で認可が出ている状態でも、FamilyControlsのCapabilityを追加していないとManagedSettingsStoreの設定が効きません。
特にApp ExtensionでManagedSettingsStoreを利用とするようなケースで追加を忘れがちなので注意してください.
Discussion