❮ 2020-11-10
Fahrplan-Visualisierung mit iOS
Das HAFAS kann eine ganze Menge, unter anderem auch genaue Verspätungsdaten und den Verlauf von Bahnstrecken anzeigen. Da ich fürs private Rumtüfteln eine App-Idee brauchte, habe ich in den letzten Monaten eine App entwickelt, die von einem ausgewählten Bahnhof oder Haltepunkt alle Ankünfte und Abfahrten der nächsten 45 Minuten sammelt, die ungefähre Zugposition aller Fahrten auf einer Map anzeigt und die Zeit zum Standort des App-Users berechnet.
Testen kann man die App hier, der Quelltext liegt auf Github.
Demo
Was (nicht) funktioniert
Da die Positionsermittlung rein auf der Polyline aus dem Hafas und der Abfahrts- und Ankunftszeit der benachbarten Halte basiert, und die Züge "fast" nur mit der Durchschnittsgeschwindigkeit simuliert werden (Langsamfahrtstellen, Streckenabschnittsgeschwindigkeit werden nicht beachtet), ist die Position natürlich nicht besonders genau. Bei meinen Tests (5 Fahrminuten vor Braunschweig Hbf) waren +/- 2 Minuten immer dabei, aber manchmal gab es auch exakte Punktlandungen. Ich habe versucht rudimentäres Beschleunigungs/ Bremsverhalten zu simulieren, was aber in der jetzigen Form nicht wirklich gut funktioniert.
Um die Anzahl der Zugriffe zum Hafas möglichst gering zu halten benutze ich auch nur den Trip-Endpoint für Verspätungen. Dieser zeigt leider für vergangene Halte nicht mehr die Verspätung an, mein Workaround ist, dass ich dann einfach die Verspätung vom nächsten Halt zur letzen Abfahrt addiere. Theoretisch könnte ich die genaue verspätete Abfahrt glaube ich noch vom IRIS bekommen, aber das würde zu immer mehr Overhead führen.
Verspätungsdaten werden automatisch auch nur vom jeweils ausgewählten Zug minütlich aktualisiert, wenn man die Statusleiste nach oben swiped werden neue Abfahrten/Ankünfte heruntergeladen und ggf. vergangene Zugfahrten gelöscht.
Herzstück der App ist aber die Berechnung der ungefähren Uhrzeit, wenn der Zug an einem vorbei fahren sollte. Die Idee hatte ich, da meine Eltern relativ nah an einer Bahnstrecke wohnen und ich immer schon mal eine Übersicht haben wollte, wann dort ungefähr die Züge vorbei fahren die in Braunschweig halten, und man hat auch eine gute Übersicht über den Trassenverlauf der Zug-Linien.
Kurz vor einem Halt treten nur noch kleinere Abweichungen auf, wie es allerdings beim Fernverkehr mitten in der Pampa, hunderte Kilometer vom nächsten Halt entfernt aussieht muss ich erst noch testen.
Deshalb werde ich die App wohl auch nie in den Store hochladen, auch weil ich nicht weiß, ob man das HAFAS einfach so für seine private App benutzen darf. Die Zugradar-App wurde ja aus ähnlichen Gründen auch abgesägt, da die Daten einfach nicht genau genug sind, deshalb seh ich die App einfach als Spielprojekt, um in kleinen Schritten immer mehr im iOS Universum zu lernen.
Und was habe ich gelernt?
- Ein bisschen mit Protocol Associated Types rumgespielt
- Wie man Code mit X-Code in eine Library auslagert und gesondert testen kann
- Wie Testflight, App-Store-Connect und App-Publishing funktioniert
- Wie man Vectorgrafiken in der App benutzt
- Wie man die Map-View und den Location-Manager benutzt
- Das man mit always-on GPS auch permanent im Hintergrund Daten aktualisieren kann.
- Das man PATs nicht mit klassicher objektorientierter Programmierung verbinden sollte, da dynamic dispatch nicht mehr so wirklich funktioniert und man keine Arrays aus Protokollen mehr benutzen kann.
Was plane ich noch
- Die Views will ich noch von MVC zu MVVM oder VIPER umziehen, und dafür Combine oder RxSwift benutzen
- Die komplette Visualisierungs-Library "reactive" machen
- Notifications einbauen, oder eine Watch-Extension dafür programmieren, die den nächsten Zug auf der Watch anzeigt.