Tischzeit
iOS-App, die die Familie zum Essen ruft. Swift 6, CloudKit, null externe Abhängigkeiten.
- Abhängigkeiten
- 0
- Plattform
- iOS 18+
- Backend
- CloudKit
Über das Projekt
Ein kleines Problem mit einer überraschend unangenehmen technischen Lösung: Jemand kocht, das Essen ist fertig, und alle anderen sitzen mit Kopfhörern in ihren Zimmern. Tischzeit schickt allen einen Ruf aufs Handy, eine zeitkritische Mitteilung, die auch im Fokus-Modus durchkommt.
Die App läuft komplett auf Apple-Frameworks: Swift 6 mit strikter Nebenläufigkeitsprüfung, SwiftUI, CloudKit als Backend, Swift Testing für die Tests. Keine einzige externe Abhängigkeit, kein Firebase, kein eigener Server, kein Account. Die Familie teilt eine CloudKit-Zone, das ist die gesamte Infrastruktur.
Genau daraus entstand die interessante Aufgabe. CloudKit unterstützt in der geteilten Datenbank keine Push-Nachrichten mit Alert, dort gibt es nur stille Benachrichtigungen. Für den Besitzer der Zone funktioniert der direkte Weg über die private Datenbank, für alle anderen nicht. Die Lösung sind zwei getrennte Zustellwege: Der Besitzer bekommt einen echten Alert-Push, den eine Notification Service Extension aufwertet, die Mitglieder bekommen einen stillen Push, der die App weckt, woraufhin diese die Mitteilung lokal selbst erzeugt.
Damit dabei niemand zwei Benachrichtigungen für denselben Ruf bekommt, meldet die CloudKit-Schicht das Ereignis nur im Fall der geteilten Datenbank an die App weiter. Ein zweiter Fallstrick liegt in derselben Ecke: CloudKit kann Pushes nicht gezielt an einzelne Geräte adressieren, es gibt nur "alle Abonnenten der Zone". Wer also erneut ruft, würde auch sich selbst benachrichtigen, deshalb trifft jedes Gerät die Entscheidung für sich, ob eine Mitteilung angezeigt wird.