Mein Kind liebt Flugzeuge immer noch, also habe ich das Radar upgegradet
(substack.com/jacobbartlett)- Die persönliche iOS-Radar-App Aviator 2.0 funktioniert nach den Ausfällen des OpenSky Network seit Anfang Dezember wieder und bündelt in diesem Update zugleich zahlreiche Verbesserungen, die sich im realen Einsatz gezeigt haben
- Das neue Kontrollmenü nutzt eine Struktur der progressiven Offenlegung, trennt wichtige Bedienungen von erweiterten Werkzeugen und verdeckt den Radarbildschirm dank SwiftUI modal detent und Hintergrundinteraktion weniger
- Das Problem, dass auch zu weit entfernte Flugzeuge erfasst wurden, wurde mit einem binären Zoom-Umschalter reduziert, der durch das Wechseln der MapKit camera distance auf 70 km oder 100 km umgesetzt wird
- Mithilfe der Daten
origin_country, Höhe undcategoryaus der OpenSky Network API kamen Flaggenanzeige, ein Tiefflugfilter für trübe Tage sowie unterschiedliche Icons für Hubschrauber, Satelliten und Flugzeuggrößen hinzu - Nutzer können mit ihren OpenSky-Network-Login-Daten HTTP Basic Auth verwenden, aber in Version 2.0 wird das Passwort in User Defaults gespeichert, weshalb sensible Passwörter nicht wiederverwendet werden sollten
Hintergrund zum Update Aviator 2.0
- Aviator — Radar on your Phone ist eine iOS-Radar-App, die gebaut wurde, um zusammen mit einem Kind Flugzeuge zu finden
- Nach dem vorherigen Beitrag hätte man über ein neues Release und Monetarisierung nachdenken können, aber die App zeigte Nutzern seit Anfang Dezember wegen Ausfällen beim OpenSky Network nur Fehler an
- Als die App erneut geöffnet wurde, war statt des ständig sichtbaren 502-Fehlers wieder der Benachrichtigungston zur Flugzeugerkennung zu hören, was bestätigte, dass sie wieder normal funktionierte
- Danach wurde an zwei Abenden an Aviator 2.0 gearbeitet und bestehende Ideen wurden umgesetzt
Neue Kontroll-UI, die das Radar weniger verdeckt
- In 2.0 wurden die Bedienelemente in ein separates Menü verschoben; wichtige Aktionen stehen oben, seltener genutzte erweiterte Werkzeuge weiter unten
- Diese Struktur verwendet progressive Offenlegung (progressive disclosure)
- Das Menü ist als SwiftUI modal umgesetzt und hat zwei
presentationDetentsprimary:0.15der Bildschirmhöheextended:0.4der Bildschirmhöhe
- Ein Drag-Indikator zeigt, dass sich das Menü erweitern lässt, und mit
presentationBackgroundInteraction(.enabled)wird verhindert, dass die Haupt-Radar-UI von einem Schatten überdeckt wird - Auf
presentationBackgroundwird Paul Hudsons emboss effect angewendet, um eine metallische Textur wie bei einem echten Radar-Bedienpult hinzuzufügen - Für 2.1 ist geplant, TipKit zu nutzen, damit auch junge Apple-Nutzer die Struktur der progressiven Offenlegung besser erkennen
Zoom-Stufe und Radarreichweite anpassen
- In 1.0 funktionierte das Radar fast zu gut und erfasste sogar Flugzeuge hinter dem Horizont oder hinter Gelände, die in Wirklichkeit nicht sichtbar waren
- In Umgebungen wie den Vororten Londons mit stufenförmigem Gelände und inselartig verbundenen Bereichen wurde das im praktischen Einsatz störend
- In offenen Gegenden waren weit entfernte Flugzeuge dagegen tatsächlich sichtbar, daher war es nicht einfach nur ein Empfindlichkeitsproblem
- Die Lösung war die Einführung einer Zoom-Funktion
- Über die
distancedercameraim MapKit SDK in Metern wird das Hinein- und Herauszoomen der Erdoberfläche umgesetzt- Wenn
zoomedtrue ist:70 * 1_000 - Wenn false:
100 * 1_000
- Wenn
- Für einen schnellen Release am Wochenende wurde die Funktion zügig umgesetzt und zur stärkeren Betonung der vergrößerten UI ein Radar-Kreis entfernt
- Ursprünglich sollte ein
Sliderdie Zoom-Stufe steuern, aber selbst auf einem A17-Chip war die Framerate nicht hoch genug, daher wird derzeit ein binärer Zoom-Umschalter verwendet
Zusätzliche Funktionen durch Daten des OpenSky Network
-
Flaggenanzeige
- Die OpenSky Network API sammelt verschiedenste Informationen aus Flugzeug-Transpondern, aber in 1.0 wurden diese Daten nicht ausreichend genutzt
- In 2.0 wurde ein Umschalter hinzugefügt, der unter jedem Flugzeug-Icon das Herkunftsland als Flaggen-Emoji anzeigt
- Die Umsetzung basiert auf dem Wert
origin_country - Es wird die vom API gelieferte Textzeichenfolge des Herkunftslands verwendet
- Diese wird mithilfe einer online gefundenen Liste von Ländernamen in einen zweistelligen Ländercode umgewandelt
- Der Ländercode wird in Unicode-Skalare umgewandelt, um das Flaggen-Emoji zu erzeugen
- Wenn Nutzer die Funktion aktivieren, wird
flight.flagals Text der MapKit annotation angezeigt
-
Modus für trübe Tage
- An trüben Tagen in Großbritannien waren viele der in der App angezeigten Flugzeuge in Wirklichkeit hinter Wolken verborgen
- Es wurde ein Button hinzugefügt, der hoch fliegende Flugzeuge ausblendet, sodass zwischen einem klaren Modus und einem Regenmodus gewechselt werden kann
- Dabei werden die vom OpenSky Network gelieferten Höhendaten genutzt; als Basiswert für niedrige Wolken werden 2,5 km verwendet
- Wenn
geo_altitude < 2500.0ist, wirdisLowAltitudetrue - Wenn die Einstellung
cloudyaktiviert ist, werden in den MapKit annotations nur Flugzeuge in niedriger Höhe angezeigt
Verbesserte Flugzeug-Icons
- Beim Testen im Park flog ein Hubschrauber direkt über den Kopf hinweg, aber Aviator zeigte ihn als normales Flugzeug-Icon an
- Die OpenSky Network API liefert mit einem zusätzlichen Query-Parameter die Eigenschaft
category, die den Flugzeugtyp des jeweiligen Transponders angibt - Diese Kategorie kann unter anderem Folgendes enthalten
- leichte Flugzeuge unter 15.500 Pfund
- schwere Flugzeuge über 300.000 Pfund
- Drehflügler wie Hubschrauber
- Raum-/atmosphärenüberschreitende Fahrzeuge
- Fallschirme oder Fallschirmspringer
- Im neuesten Update werden nun Größenklassen von Flugzeugen unterschieden, und Satelliten sowie Hubschrauber erhalten eigene Icons
- Im Enum
AircraftCategorywerden Bild, Emoji und Skalierungswert getrenntrotorcraftverwendet das SFSymbolxmark.circle.fillspaceTransatmosphericverwendet das Emoji 🛰️small,large,heavyverwenden die Skalierungen0.6,1,1.5
- Das Hubschrauber-Emoji wirkte nach der Umwandlung in eine einfarbige flache Darstellung zu rundlich, daher wurde ein abstrakteres SFSymbol mit Kreuz in einem Kreis gewählt
- Um Emojis wie Bilder zu behandeln, wird
Textskaliert und dann als Maske für einRectangleverwendet, worauf Farbe und ein CRT-Bildschirmeffekt angewendet werden
OpenSky-Network-Login für Nutzer
- Es wurde eine Funktion hinzugefügt, mit der Nutzer ihre eigenen OpenSky-Network-Zugangsdaten eingeben können
- Diese Funktion war nach der Android-Version eine der am häufigsten gewünschten und soll Rate Limiting bei nicht authentifizierter API-Nutzung vermeiden
- Im vollständigen Kontrollmenü können Kontodaten eingegeben werden; außerdem gibt es einen Link zur Registrierungsseite
- Die Umsetzung erfolgt mit
TextFieldundSecureFieldin SwiftUI@AppStorage("username")@AppStorage("password")
- In 2.0 wird das Passwort bei der schnellen Produktivsetzung in User Defaults gespeichert
- Im nächsten Release soll es im Keychain gespeichert werden; bis dahin sollten keine sensiblen Passwörter wiederverwendet werden
- Eingegebener Benutzername und Passwort werden Base64-kodiert und als
Basic-Authentifizierung imAuthorization-Header an API-Anfragen angehängt
Abschluss
- Aviator 2.0 ist ein Update, das eine App zum Spielen und Entdecken mit einem Kind weiter verbessert
- Es wird um Kommentare mit Funktionsideen oder ASO-Tipps gebeten sowie um Downloads und Bewertungen für Aviator — Radar on your Phone 2.0
1 Kommentare
Hacker-News-Kommentare
Fortsetzung eines Beitrags, der vor zwei Monaten ziemlich populär war
0: https://news.ycombinator.com/item?id=38435908 My toddler loves planes, so I built her a radar (1304 points, 56 days ago)
Beim Blick auf die App musste ich an ein Problem denken, das ich damals beim Programmieren von DVDs hatte. Bei Toggle-Buttons ist nicht klar, welcher Modus gerade aktiv ist
Es ist verwirrend, ob das Flaggen- oder Wolken-Icon den aktuellen Modus zeigt oder ob man darauf drücken muss, um in diesen Modus zu wechseln. Auch beim Wetter-Toggle fühlt es sich umgekehrt an: Bedeutet ein Druck auf die Wolke, dass man den bewölkten Modus sehen will, oder dass man zur klaren Ansicht wechseln will?
In meinem aktuellen Projekt ändern +/- Buttons die Größe eines Zeitfensters: Bei der Startzeit verringert + den Sekundenwert und - erhöht ihn. Bei der Endzeit ist es umgekehrt. Aus Sicht der Fenstergröße verhalten sich beide wie erwartet, deshalb muss am Ende die Perspektive des Nutzers eindeutig gemacht werden
Auch der Untertitel-Toggle von YouTube wechselt zwischen weißer Schrift auf schwarzem Grund und schwarzer Schrift auf weißem Grund, sodass man erst einmal drücken muss; wenn sich die Lippen bewegen, aber keine Untertitel erscheinen, muss man den anderen Icon-Modus ausprobieren
Mit dem Übergang zu Touchscreens scheint der gesunde Menschenverstand für zustandsbehaftetes Positions-Input-Feedback verloren gegangen zu sein
Und ja, es war tatsächlich verwirrend. Bei einem Bugfix in letzter Minute habe ich ausgerechnet das Wolken-Icon umgekehrt zu den anderen eingebaut und so veröffentlicht
Es wäre wirklich cool, wenn ein Flugzeug beim Durchlauf des Radarscans kurz aufblitzen würde und dann an fester Position bis zum nächsten Sweep langsam verblasst
Außerdem wäre es schön, anhand der aktuellen GPS-Höhe und Position des Geräts sowie der umliegenden Gebäude, Hügel und Höhen aus OpenStreetMap die je Azimut sichtbare Skyline zu berechnen. Dann könnte man das auf der Karte wie Radarabschattung darstellen. So ähnlich wie ein Fischfinder, der durch einen Baumstamm blickt, oder Schiffsradar, bei dem andere Schiffe etwas verdecken
Wenn man das baut, würden sich Leute aus der Branche wohl am Kopf kratzen und sich fragen, wie ein Telefon radiale Scans macht
[1] https://www.researchgate.net/figure/Occlusion-percentage-for...
Das hatte ich schon im Blog geschrieben, aber als Elternteil eines Kleinkinds stimme ich zu, dass die Farbauswahl der wichtigste Teil ist
Ich habe ein paar Funktionsideen, die vielleicht noch nicht umgesetzt sind, weil es ja ein lustiges Nebenprojekt ist. Erstens eine Live View, die mit der Handykamera und den AR-Funktionen des iPhone einen Punkt an die ungefähre Position des Flugzeugs setzt. Ich habe schon ein wenig Code geschrieben, der das aus Nutzerposition und ADS-B-Informationen berechnet
Zweitens könnte man Flugzeuge als „gesehen“ oder „verpasst“ markieren und dieses Feedback nutzen, um die Anzeige anzupassen
Drittens: Badges und Statistiken. Wenn deine Tochter meinem Kind ähnelt, wird sie es lieben, in der App Badges zu bekommen. Man könnte frühere Beobachtungen in einer lokalen DB speichern und Dinge wie „Anzahl gesehener Airlines“, „Anzahl gesehener Flugzeugtypen“, „längste Flugzeit“ oder „kürzeste Flugzeit“ verfolgen. Ich verstehe allerdings gut die Probleme, die mit Gamification bei Apps für Kinder einhergehen
Wir sprechen oft darüber, warum man keine 30 Dollar für digitale Währungen wie Robux ausgeben sollte. Ich erkläre, dass das etwas anderes ist als Dinge mit echtem Wert, etwa ein Tennisschläger oder Schuhe
Deshalb wehre ich mich gegen Gamification und versuche, ihm Werkzeuge zu geben, damit es nicht stundenlang in repetitive Aufgaben hineingezogen wird, nur um Badges oder wertlose digitale Artefakte zu bekommen
Bei einer App für Kinder würde ich solche Funktionen lieber weglassen. Man kann zeigen, dass es Apps gibt, die keine Werbung haben und nicht gamifiziert sind, dem Leben aber echten Wert hinzufügen
Hätte jemand aus der HN-Community Lust, ein Open-Source-Crowdsourcing-Projekt zu starten, um das auf Android zu portieren?
Die Lizenz ist nur eine Vermutung, aber wer das initiale GitHub-Repository anlegt, könnte wohl die Formulierung des Autors verwenden: „Ich warte darauf, dass ein ambitionierter Android-Engineer es selbst portiert. Ich habe genug Details in den Beitrag gepackt. Solange es für alle kostenlos bleibt, ist es in Ordnung.“
Selbst wenn ich zu dieser Radar-App keine hochwertige Android-App beitragen kann, wäre es wahrscheinlich gut investierte Zeit, etwas zu portieren, das zum Paradigma „An app can be a home-cooked meal“[0] passt. Es ist vermutlich mit einer einheitlichen Vision und einem klaren Paradigma geschrieben und frei von Bloat, Werbung, Tracking usw., sodass der Code leichter zu verstehen sein dürfte
Dieser Vorschlag könnte mich vielleicht wieder zur Freude am Programmieren führen
0: https://news.ycombinator.com/item?id=38877423
Etwas anderes, aber als jemand mit schlechtem Orientierungssinn ist für mich die wichtigste Funktion auf dem Smartphone, wie genau der kleine Pfeil auf der Karte zeigt, in welche Richtung ich schaue.
Ich nutze Android; wenn es sich nicht sicher ist, zeigt es einen blauen Unsicherheitskegel an und fordert mich manchmal auf, das Handy in einer Acht zu bewegen oder zur Kalibrierung auf Gebäude in der Umgebung zu zeigen.
Wo liegen hier technisch die Grenzen? Ist das iPhone besser als Android? Liegt es an der Hardware, am Beschleunigungssensor, am Kompass, am GPS-Signal oder an der Software? Es verwirrt mich immer noch ziemlich oft und zeigt den Kegel in die völlig falsche Richtung. Wenn das iPhone das deutlich besser kann, wäre mir das fast wichtig genug, um zu wechseln.
Ich dachte, es gäbe Einschränkungen auf GPS-Seite, aber der Heading-Delegate von CoreLocation liefert zumindest bei der 120-Hz-Bildrate meines Geräts die Richtung perfekt zurück.
Vielleicht ist Google Maps einfach nicht besonders gut.
Beide liegen ähnlich oft mit der Richtung daneben. Das ist allerdings nur eine Einschätzung aus der Nutzungserfahrung, keine gesicherte Tatsache.
Früher war unter iOS der träge Pfeil ziemlich nervig, inzwischen fällt mit schnellerer Hardware eher der springende Pfeil anderer Plattformen auf.
Kurz gesagt: Die meiste aktuelle Hardware ist ähnlich gut darin, die eigene Position in Raum und Zeit recht genau zu erfassen. Wie gut aber mit den aktuellen Daten Koppelnavigation und Lagebestimmung funktionieren und wie die von Nutzern erwartete Rauschfilterung in der Hand umgesetzt wird, unterscheidet sich je nach Navigationssoftware.
Durch die Tony-Hawk-Spiele bin ich zu Heavy Metal gekommen. Motörheads „Ace of Spades“ in THPS3 und Iron Maidens „Number of the Beast“ in THPS4 waren der Auslöser; es könnte also einen Brotkrumenpfad von Plattformspielen zu Heavy Metal geben.
Gut gemacht, denn der wichtigste Nutzer wurde eindeutig glücklich gemacht.
Cool. Außerdem bekomme ich Lust, ein
!remindmezu setzen, um in 18 Jahren zu prüfen, ob die Tochter die Fluglotsenprüfung bestanden hat.Ich frage mich, ob Kinder auch in der Welt nach 9/11 noch ins Cockpit eingeladen werden können.
Ich erinnere mich vage daran, einen Knopf gedrückt zu haben, während mein Vater auf die sich bewegenden Instrumente zeigte. Klar in Erinnerung ist mir das Gefühl, auf dem Weg zurück zum Sitz das größte Kind der Welt zu sein.
Nach 9/11 dürfte so etwas wohl definitiv schwer passieren.
Wenn man dagegen nach der Landung fragt, ob das Kind das Cockpit sehen darf, sind die Erfolgschancen deutlich höher.
Während des Flugs lassen sie kaum noch Crew hinein, gelegentlich darf nur die leitende Flugbegleitung hinein. Die Kinder fragen beim Einsteigen, wenn die Cockpittür noch offen ist.
Es war ein US-Inlandsflug mit JetBlue.
Irgendwo habe ich noch die Delta-Flügelanstecknadel, die ich als Kind auf einer Reise bekommen habe, als ich unterwegs das Cockpit sehen durfte. Das war eine tolle Erfahrung, an die ich mich bis heute erinnere, und ich hoffe, dass andere Kinder wenigstens einen Teil davon erleben können.