iOS 開発が初めての状態でサイトブロック系のセルフコントロールアプリを作ろうとすると、調べるほど「思っていたのと違う」部分が積み重なっていく。DNS レベルのブロックを目指して NEDNSProxyProvider から始め、Extension の存在を知り、署名の壁にぶつかり、最終的に Screen Time API の正しい使い方にたどり着くまでに、いくつかの判断ポイントがあった。
この記事は、その過程で得た知識を5つのトピックに分割した記事のインデックスだ。iOS 未経験で同じ困りごとを持っている人に届けばいいと思っている。
1. まず入口を間違えないために
iOSでサイトブロックを実装しようとすると NEDNSProxyProvider が目に入る。名前も用途も合っているように見えるが、これは App Store 配布のアプリ向けではなく、MDM 管理のスーパーバイズドデバイス向けのクラスだ。
iOSでサイトブロックを作るとき、NEDNSProxyProviderを選んではいけない
DNS ブロックのアイデアを捨てて Screen Time API に移行する判断をする前に読んでほしい。
2. Screen Time API の基本設計
正解は FamilyControls + ManagedSettings の組み合わせだ。AuthorizationCenter で認可を取り、FamilyActivityPicker でブロック対象を選択し、ManagedSettingsStore にルールを書き込む。
FamilyControls + ManagedSettings で iOS の自己制限ブロックを設計する
ブロック対象をフリーテキスト URL で管理しようとすると詰まる。FamilyActivitySelection のトークンベース設計が前提であることも、この記事で説明している。
3. Shield Extension は2本必要
ManagedSettings でルールを設定したとき表示されるシールド画面をカスタマイズするには、Extension が2本必要だ。Xcode でターゲットを1つ追加すればいいと思っていると、ここで詰まる。
iOS Shield Extension は1本ではなく2本必要という話
Shield Action Extension(ShieldActionDelegate)と Shield Configuration Extension(ShieldConfigurationDataSource)それぞれの Extension Point Identifier、プリンシパルクラス、Info.plist 設定を整理している。
4. シールドからアプリへのアンロック連携
シールド画面から直接メインアプリを起動してアンロックフローを実行する経路は Apple が閉じている。ShieldActionDelegate が返せる値は .close か .defer のみだ。
Shield ExtensionからメインアプリへのアンロックをApp Group経由で実装する
App Group の共有 UserDefaults に「アンロック要求」を書き込み、ユーザーがアプリを開いたタイミングで読み取るハンドオフパターンの実装を書いている。なぜこの制約があるのかという背景と、UX の割り切り方についても触れた。
5. 実機テストには有償会員が必要
Family Controls (Development) エンタイトルメントは Personal Team(無償 Apple ID)では取得できない。Apple Developer Program への加入が実機テストの前提になる。
Personal Team では Family Controls の実機テストができない
シミュレータでできる範囲とできない範囲、In-App Purchase など他のエンタイトルメントへの影響、いつ有償会員になるべきかの判断基準を整理している。
開発の流れとしてのまとめ
iOS 未経験からこのアプリを作るとき、5つを読んだ上で実装の順序を整理するとこうなる。
まず NEDNSProxyProvider のアイデアを諦める。次に FamilyControls + ManagedSettings の基本設計を固め、AuthorizationCenter と FamilyActivityPicker を使った UI フローを作る。Shield Extension を2本追加して Info.plist を正しく設定する。App Group 経由のアンロックハンドオフを実装する。Apple Developer Program に加入して実機で動作確認する。
この順に進めると、後から設計を作り直す可能性が最も低くなると思っている。iOS に慣れていないと序盤の「どの API を選ぶか」のミスが後になって全部響いてくるので、最初に方向を確認しておくことが一番効く。
hsb.horse