logo hsb.horse
← Zur Blog-Übersicht

Blog

Ein Designleitfaden zum Bau einer iOS-Self-Control-App mit der Screen-Time-API

Von der Sackgasse mit NEDNSProxyProvider über ein FamilyControls- + ManagedSettings-Design bis zu zwei Shield Extensions, dem Unlock-Handoff per App Group und den Grenzen eines Personal Teams. Dieser Artikel fasst das Gesamtbild einer iOS-Blockier-App mit der Screen-Time-API zusammen.

Veröffentlicht:

Wenn man ohne iOS-Erfahrung eine Self-Control-App zum Blockieren von Websites bauen will, stößt man schnell auf eine Reihe von Momenten, in denen man merkt: Das funktioniert ganz anders als erwartet. Ich habe mit NEDNSProxyProvider angefangen, weil ich auf DNS-Ebene blockieren wollte, dann Extensions kennengelernt, an Signierungsgrenzen festgehangen und schließlich den tatsächlichen Einsatzpfad der Screen-Time-API verstanden.

Dieser Artikel ist ein Index über fünf einzelne Beiträge, die aus diesem Weg entstanden sind. Ich hoffe, er hilft Menschen mit wenig iOS-Erfahrung, die an derselben Stelle feststecken.


1. Gleich am Anfang nicht falsch abbiegen

Wenn man Website-Blocking unter iOS umsetzen will, fällt einem schnell NEDNSProxyProvider auf. Name und Einsatzzweck wirken passend, aber die Klasse ist nicht für Apps gedacht, die im App Store verteilt werden. Sie ist für überwachte Geräte im MDM-Kontext gedacht.

Beim Bau von Website-Blocking unter iOS sollte man NEDNSProxyProvider nicht wählen

Lesen Sie das zuerst, bevor Sie entscheiden, die DNS-Blocking-Idee aufzugeben und stattdessen zur Screen-Time-API zu wechseln.


2. Das Grunddesign der Screen-Time-API

Die richtige Kombination ist FamilyControls + ManagedSettings. Die Autorisierung holt man über AuthorizationCenter, die Auswahl der zu blockierenden Ziele läuft über FamilyActivityPicker, und die Regeln werden in ManagedSettingsStore geschrieben.

Self-Control-Blocking unter iOS mit FamilyControls + ManagedSettings entwerfen

Wenn man versucht, blockierte Ziele als frei eingegebene URLs zu verwalten, läuft man schnell in eine Sackgasse. Der Artikel erklärt auch, warum das tokenbasierte Design rund um FamilyActivitySelection die eigentliche Grundlage ist.


3. Es werden zwei Shield Extensions benötigt

Um den Shield-Bildschirm anzupassen, der nach dem Setzen von Regeln durch ManagedSettings erscheint, braucht man zwei Extensions. Wenn man denkt, ein zusätzliches Target in Xcode genüge, bleibt man genau hier hängen.

Eine iOS-Shield-Oberfläche braucht zwei Extensions, nicht eine

Dort sind die Extension Point Identifier, Principal Classes und Info.plist-Einstellungen sowohl für die Shield Action Extension (ShieldActionDelegate) als auch für die Shield Configuration Extension (ShieldConfigurationDataSource) zusammengefasst.


4. Unlock-Handoff vom Shield zur App

Apple stellt keinen Weg bereit, mit dem der Shield-Bildschirm direkt die Haupt-App öffnen und einen Unlock-Flow starten kann. ShieldActionDelegate kann nur .close oder .defer zurückgeben.

Unlock-Handoff von einer Shield Extension zur Haupt-App per App Group implementieren

Dieser Artikel beschreibt das Handoff-Muster, bei dem die Extension eine “Unlock-Anfrage” in gemeinsame UserDefaults innerhalb einer App Group schreibt und die App sie liest, sobald die Nutzerin oder der Nutzer die App öffnet. Außerdem geht es darum, warum diese Beschränkung existiert und wie man die UX innerhalb dieser Grenzen sinnvoll gestaltet.


5. Für Gerätetests braucht man ein bezahltes Entwicklerkonto

Das Entitlement Family Controls (Development) ist mit einem kostenlosen Apple-ID-basierten Personal Team nicht verfügbar. Tests auf echten Geräten setzen die Mitgliedschaft im Apple Developer Program voraus.

Family Controls lässt sich mit einem Personal Team nicht auf echten Geräten testen

Der Artikel erklärt, was im Simulator möglich ist und was nicht, wie sich das zu anderen Entitlements wie In-App Purchase verhält und wann sich eine kostenpflichtige Mitgliedschaft lohnt.


Zusammenfassung als Entwicklungsreihenfolge

Wenn man diese App ohne iOS-Vorerfahrung baut, wird die Implementierungsreihenfolge nach der Lektüre dieser fünf Beiträge deutlich klarer.

Zuerst verabschiedet man sich von der Idee mit NEDNSProxyProvider. Danach legt man das Grunddesign mit FamilyControls + ManagedSettings fest und baut den UI-Flow mit AuthorizationCenter und FamilyActivityPicker. Anschließend fügt man die zwei Shield Extensions hinzu und konfiguriert Info.plist korrekt. Danach implementiert man das Unlock-Handoff per App Group. Zum Schluss tritt man dem Apple Developer Program bei und testet alles auf einem echten Gerät.

In dieser Reihenfolge ist die Wahrscheinlichkeit am geringsten, dass das Design später neu gebaut werden muss. Gerade ohne iOS-Erfahrung vergiftet eine falsche API-Entscheidung am Anfang oft alles, was danach kommt. Deshalb spart es am meisten Zeit, die Richtung früh zu klären.