Meine erste iOS-App
Alles begann mit einer einfachen Frage: Wann kommt das nächste WC? Wir waren zusammen auf der Autobahn unterwegs und so langsam drückte die Blase. Die Frage war nun, wann das nächste WC entlang unserer Autobahn kommt. Über das Navi im Auto konnten wir die nächsten Rastplätze (also mit Restaurant) finden, diese liegen jedoch auch manchmal etwas weit weg. Daher war die Idee geboren, eine einfache App zu bauen, die einem die Distanz und Zeit zum nächsten WC anzeigen kann.
Erste Recherche zu Daten
In einer ersten Recherche zeigte sich, dass noch keine anderen Apps diese Info bereitstellen. Auch die Suche nach WCs in diversen Kartenanwendungen führt nur manchmal zum Erfolg. Spannend ist, dass der Bund eine eigene App für die Autobahnen anbietet. In dieser lassen sich auch Informationen für einzelne Parkplätze aufrufen, unter anderem auch, ob dieser über ein WC verfügt. Dies ist eine sehr vielversprechende Option. Zudem ist die API hinter der Autobahn-App auch unabhängig aufrufbar.
Erste App-Versuche
Jetzt ist also die Frage, wie sich die Daten in einer App verwenden lassen. Dazu brauche ich in erster Linie einen Server, der die Daten aufbereitet und bereitstellt. Als zweite Komponente braucht es eine App, die den Standort des Benutzers erfassen und verarbeiten kann. Kommend eher aus der Backend-Entwicklung war für mich der Ansatz klar (Spoiler-Alert: Und es wird dann anders kommen): Ich verwende die App, um den Standort mittels GPS zu erfassen und an das Backend zu schicken. Dieses gibt dann die Informationen über das nächste WC zurück an die App. Also habe ich eine kleine Web-App geschrieben, die über GPS den Standort mittels 3 Koordinaten bestimmen kann.
Erstes Server-Backend
Fürs Backend wollte ich zum ersten Mal die “Cloud” ausprobieren, da ich mir davon erhofft hatte, besser skalieren zu können. Für Azure gab es eine kostenlose Testversion, sodass ich damit direkt starten konnte. Um nicht zu viele Komponenten verwenden zu müssen, habe ich mich für eine Azure Function entschieden. Diese hat allerdings den Nachteil, dass jedes Mal die gesamte Berechnung laufen musste. Die Funktion erhält dabei die 3 Koordinaten und liefert die nächsten WCs als Ergebnis zurück. Nach einem Hin und Her lief die Berechnung einwandfrei. Allerdings zeigte sich ein anderes Problem: Der Kaltstart der Azure-Funktion. Dies bedeutet, dass das Hochfahren der Cloud eine gewisse Zeit in Anspruch nimmt. Das führt dann dazu, dass insbesondere wenn länger keine Anfragen erfolgt sind, das Ergebnis teilweise 10 Sekunden braucht. Auch nach diversen Optimierungen konnte ich die Zeit nur auf 5 Sekunden reduzieren. Das ist aus Nutzerperspektive wenig optimal.
Neue Architektur
Daher musste die Architektur noch einmal angepasst werden und ich von meiner bisherigen Denkweise abweichen. Die neue Idee war es nun, dass auf dem Server alle Daten vorab berechnet werden und sich die App die Daten lädt, lokal speichert und dann die ganze Berechnung lokal durchführt. Dafür musste natürlich das Backend angepasst werden. Mittlerweile läuft es auf meinem IONOS-Server. Auch die App ist nun in Swift und SwiftUI geschrieben, sodass die lokale Berechnung deutlich effizienter erfolgt. Durch den Cache dauert die Bestimmung des nächsten WCs nun weniger als 1 Sekunde.
Swift / SwiftUI
Swift als Programmiersprache war sehr einfach zu verstehen. Es war für mich schon eine größere Umstellung mit einer Reactive UI zu arbeiten. Aber nach einer gewissen Einarbeitungszeit, habe ich sehr geschätzt, mich nicht um den Zustand kümmern zu müssen (außer in CarPlay, mehr dazu später). Über das Jahr Entwicklungszeit sind die eigenen Ansprüche immer weiter gewachsen, auch beim Vergleich wie andere Apps etwas umsetzen. Immer wenn ich einen neuen Trick in SwiftUI herausgefunden hatte, wollte ich es gleich an allen Stellen umsetzen. Angefangen mit nur einer Startseite und einer Liste der nächsten WCs, umfasst die App jetzt auch eine interaktive Karte mit Slideover, eine Detailansicht, Einstellungen und auch Feedbackfunktionen. Mit dem Release-Stand bin ich wirklich sehr zufrieden und stolz auf meine erste iOS App.
CarPlay
Während wir die App bei unseren Autobahnfahrten ausprobierten, wurde deutlich, dass sie aktuell nur vom Beifahrer verwendet werden darf. Allerdings sind auch viele Personen einzeln unterwegs und hierfür wäre eine Integration in CarPlay notwendig. Da dies nicht automatisch jeder App zur Verfügung steht, musste ich einen Antrag bei Apple einreichen. Dieser Prozess ist allerdings sehr intransparent. Nachdem mehrere Monate keine Antwort kam, füllte ich das Formular erneut aus und stellte parallel eine Anfrage an den Support. Nach ein paar weiteren Wochen habe ich die Freigabe für CarPlay erhalten. Es war sehr spannend zu sehen, dass die Entwicklung für CarPlay sich sehr von SwiftUI unterscheidet. Es fühlt sich wie eine ganz andere Welt an. Nach viel Try-and-Error und diversen Hacks mit der Dokumentation funktioniert die CarPlay-Version der App. Hierbei stehen alle Funktionen zur Verfügung, die fürs Fahren relevant sind.
Daten
Wie sich im Laufe der Entwicklung herausstellte, sind die Daten vom Bund eine gute Basis, aber weit davon entfernt, vollständig zu sein. Bei unseren Testfahrten haben wir häufiger festgestellt, dass Rastplätze fehlten oder auch die Information, ob ein Rastplatz ein WC hat fehlerhaft sind. Daher habe ich auch einen Großteil der Zeit damit verbracht, die Daten automatisiert und manuell aufzubereiten. Dies erfolgte mittels Abgleich weiterer Quellen wie Here Maps oder TomTom, da auch dort nicht immer die Angaben korrekt waren. Darüber hinaus habe ich auch eigene Tools entwickelt, um die Daten auf Plausibilität zu prüfen oder auch die Autobahnrichtung automatisch zu bestimmen. Die schlechte Datenlage ist einer der Hauptgründe, warum die Entwicklung der App so viel Zeit in Anspruch genommen hat. Daher seht es mir bitte nach, sollten weiterhin Fehler in den Daten sein. Meldet sie mir gerne, dann kann ich sie korrigieren. Neben den Daten zu WCs enthält der Datensatz inzwischen auch weitere Informationen über einen Rastplatz; ob eine Tankstelle / Lademöglichkeit vorhanden ist und auch ob es sich um einen Rastplatz oder Rasthof (mit Restaurant) handelt.
Weitere Herausforderungen
Wie es bei vielen Entwicklungen vorkommt, bin auch ich im Laufe der Zeit auf weitere spannende Herausforderungen gestoßen. Da wäre zum einen das Problem der Autobahnbaustellen. In den Baustellen ist es nicht möglich die korrekte Fahrdistanz zu bekommen, da das iPhone denkt, dass man sich auf der anderen Fahrbahn befindet. Daher musste ich ein Verfahren entwickeln, um zwischen der Luft- und Fahrdistanz zu wechseln. Dies ist auch ein Herausforderung bei der Bestimmung der Fahrtrichtung. Weiterhin sind Autobahnen wie die A44 spannend, da diese mehrfach unterbrochen ist. Daher habe ich die Unterbrechungen automatisch bestimmt, um korrekt ausgeben zu können, wann das nächste WC kommt. So habe ich in der Zeit vieles über die Deutschen Autobahnen und den Aufbau von Rastplätzen gelernt.
Kosten der App
Kurz möchte ich noch auf das Kostenmodell der App eingehen. Ich habe mich lange damit befasst, welches Modell insgesamt fair wäre. Da mir durch den Betrieb der App und auch die Entwicklung durchaus Kosten entstanden sind und entstehen, war für mich klar, dass ich sie nicht gratis zur Verfügung stellen möchte. Somit blieben noch die Möglichkeiten eines Abos, Einmalkauf oder In-App Kauf. Ich selbst bin kein großer Fan von Abos, insbesondere wenn ich auch nicht garantieren kann, dass regelmäßig große neue Feature entwickelt werden. Bei einem Einmalkauf war meine Befürchtung, dass viele die App gerne vorher ausprobieren wollen und nicht wissen, dass sie Apps zurückgeben können. Somit bleibt noch der einmalige In-App Kauf. Diesen habe ich kombiniert mit einer Anzahl an Freisuchen, bevor der Benutzer oder die Benutzerin eine Freischaltung benötigt. Dies ist aus meiner Sicht sehr fair, um die App ausprobieren zu können.
Abschließende Gedanken
Es war und ist weiterhin eine spannende Herausforderung, diese anfangs einfach erscheinende Frage nach dem nächsten WC auf einer Autobahn. Die App ist jetzt im AppStore, die Entwicklung ist aber nicht beendet. Ich habe viele weitere Ideen für die App, die je nach Zeit umgesetzt werden. Daher ist die App eher als MVP zu sehen und ich freue mich auf eure Rückmeldungen.
Weiterhin möchte ich noch einen großen Dank an gpskoordinaten.de/ richten. Die Seite war super hilfreich bei der Validierung und dem Testen.
Zum Abschluss gilt mein besonderer Dank Allen, die an der Entwicklung mitgewirkt haben; sei es beim Brainstorming, Suchen nach Fehlern oder dem Testen.