Mein finales Design der App war nun fertig umgesetzt, sogar mit der Möglichkeit, den Dark-Modus zu wählen. Jetzt musste die App nur noch gründlich getestet werden und dann steht doch einem App-Store-Eintrag nichts mehr im Weg, oder?
Ich hätte es besser wissen können, aber mein Ziel war es, die App pünktlich zum 01.01.2025 in den Store zu bekommen. In meinem Kopf malte ich mir aus, zum Shootingstar unter den Rauchentwöhnung-Apps der Vorsatz-Saison 2025 zu werden. Also schnell die finale Version zu TestFlight hochladen und ein letztes Mal testen.
Die Rückkehr der UUID
Schon beim ersten Öffnen der aktuellen Version fällt mir eine Sache auf – ich sehe nichts. Meine Punkte und mein Highscore sind nicht mehr da.
Meine App nutzt CloudKit, um die Daten in der iCloud des Nutzers zu speichern und zu synchronisieren. Eine Funktion, die schon beim Implementieren viele Fragezeichen bei mir hinterließ, da ein Großteil automatisch von Xcode konfiguriert wird.
Um den Fehler zu finden, nutze ich das erste Mal die Funktion „Code-Ordner hochladen“ bei Gemini 1.5 Pro und schicke meine Logs mit. Es folgt eine genaue Analyse möglicher Schwachstellen, und ich verbringe die nächsten Stunden damit, schrittweise den Code zu optimieren und zu testen.
Am Ende ist klar, das Thema UUID tritt wieder in mein Leben. Ganz am Anfang war ich daran gescheitert, bei meinen HistoryEntries ein Attribut UUID hinzuzufügen und hatte mich für eine einfache ID entschieden. Das reichte bei meinem einfachen MVP aus, sorgte jetzt aber für Fehler bei der Synchronisierung, da es durch das intensive Testen HistoryEntries mit derselben ID in der Datenbank gab. Es kostete mich einen weiteren Tag, endlich auf UUID umzustellen und die Speicherlogik zu verbessern. Dann sehe ich endlich wieder meinen letzten Spielstand in der App.

Zurücksetzen bitte
Von meinen Testern höre ich vermehrt den Wunsch, die Daten in StreakFree zurücksetzen zu können. Aus Produktsicht kann ich den Wunsch wenig nachvollziehen, da die Rauchentwöhnung eine Reise ist, die nicht einfach genullt werden sollte. Aber am Ende gebe ich nach und überlege mir eine Lösung.
Da meine App auf ein Menü verzichtet und ich alle Einstellungen bisher in die App-Einstellungen bei iOS ausgelagert habe, ist dieser Ort auch jetzt meine erste Anlaufstelle. Ich schildere Gemini also meinen Wunsch, einen Button zur Root.plist hinzuzufügen, der alle Daten in der Datenbank löscht.
Wie gewohnt ist dies laut Gemini schnell gemacht und ich bekomme den benötigten Code. Doch dieses Mal stoße ich schnell auf Probleme. Egal, wie ich es versuche, ich sehe nie den gewünschten Button. Also stelle ich die zentrale Frage: „Ist es überhaupt möglich, einen Button in der Root.plist zu haben?“ Die Antwort kommt sofort: „Nein“. Die Root.plist kann nur Parameteränderungen an die App weitergeben, aber keine Aktionen direkt ausführen. Es gibt einen Umweg über eine Switch, die dann für die Aktion „Daten zurücksetzen“ den Parameter „an“ weitergibt. Netflix nutzt diese Lösung bei ihrer App, um die Nutzerdaten zu löschen. Allerdings reagiert meine Netflix-App so gar nicht auf eine Veränderung der Switch, und die Nutzerdaten werden nicht gelöscht. Zusätzlich stellt sich die Switch auch nicht wieder zurück, sondern bleibt auf „an“. Das ist mir als Nutzer dann doch zu verwirrend.
Das Zurücksetzen der Daten muss also doch in der App ausgelöst werden. Ich starre meine App an und überlege, ob sich nicht doch an einem anderen Ort ein Button verstecken ließe und ob ich nicht vielleicht sogar eine zusätzliche Seite für Einstellungen benötige. Mich beschleicht das Gefühl, nie mit dieser App fertig zu werden. Ich schaue den iPod Touch an, der auf meinem Schreibtisch liegt. In den Anfängen von iOS fühlte es sich magisch an, wenn man durch Schütteln des iPhones / iPods eine Aktion ausführen konnte. Moment mal, ist das nicht die Lösung?
Der unschlagbare Vorteil ist, dass ich mir Anpassungen der UI spare und die Bedienung weiterhin minimalistisch bleibt. Leider gibt es auch ein paar Nachteile. Es fängt damit an, dass der Nutzer gar nicht weiß, dass es diese Funktion gibt (also eigentlich in meinem Sinne und für mich ein Vorteil). Dann besteht die Gefahr, dass die Aktion zufällig ausgelöst wird. Es gibt zwar noch ein Pop-up, indem die Löschung bestätigt werden muss, aber es kann den Nutzer verwirren. Zu guter Letzt ist es nicht optimal, wenn ein einfaches Schütteln die weitreichende Aktion des Zurücksetzens auslöst. Hierfür würde man normalerweise einen sehr roten Button in den Einstellungen verstecken – wenn man denn Einstellungen hätte.

Wie viele Zigaretten habe ich in den vergangenen 30 Tagen nicht geraucht?
Endlich habe ich die finale Version fertig. Das Projekt zieht sich mehr und mehr in die Länge. Die Vorsatz-Saison 2025 startete ohne StreakFree im App-Store. Aber endlich war ich so weit, meine App final zu testen und mir dabei das Rauchen abzugewöhnen. Dachte ich.
Ich sitze nach einer Fahrradtour auf der Terrasse und scrolle durch die Statistiken meiner Suunto App. Wie viele Kilometer bin ich in dieser Woche gefahren? Wie viele im letzten Monat? Und dieses Jahr?
Wäre es nicht interessant zu wissen, wie oft ich in einem bestimmten Zeitraum auf „Rauchfrei bleiben“ gedrückt habe? Verdammt!
Also kommt, wie es kommen muss, und ich ergänze meine Datenbank um eine neue Entität, implementiere die Klasse „StatisticsManager“ und passe die UI auf meiner Verlaufsseite an. Zu meiner Verwunderung klappt dieses Mal alles auf Anhieb und eine kräftezehrende Bugfix-Phase bleibt mir erspart.

Jetzt war es das aber endgültig und ich beginne meinen Selbstversuch.
Artikel teilen
Last modified: Juni 5, 2025