Mon enfant aime toujours les avions, alors j’ai amélioré le radar
(substack.com/jacobbartlett)- L’app radar iOS personnelle Aviator 2.0 fonctionne de nouveau depuis la panne d’OpenSky Network qui durait depuis début décembre, et cette mise à jour corrige d’un coup plusieurs points de friction apparus à l’usage réel
- Le nouveau menu de contrôle adopte une structure de divulgation progressive qui sépare les actions principales des outils avancés, et il est conçu pour moins masquer l’écran radar grâce aux modal detents de SwiftUI et à l’interaction avec l’arrière-plan
- Le problème de détection d’avions trop éloignés a été réduit avec un basculeur de zoom binaire, implémenté en faisant passer la distance de caméra MapKit à 70 km ou 100 km
- En exploitant les données
origin_country, d’altitude etcategoryde l’API OpenSky Network, l’app ajoute l’affichage des drapeaux, un filtre basse altitude pour les jours couverts, ainsi que des icônes distinctes pour les hélicoptères, les satellites et les tailles d’appareil - Les utilisateurs peuvent employer leurs identifiants OpenSky Network via une authentification HTTP Basic, mais dans la version 2.0 le mot de passe est stocké dans User Defaults, ce qui impose d’éviter toute réutilisation d’un mot de passe sensible
Contexte de la mise à jour Aviator 2.0
- Aviator — Radar on your Phone est une app radar iOS créée pour repérer des avions avec son enfant
- Après le billet précédent, il aurait été possible de réfléchir à une nouvelle release ou à des opportunités de monétisation, mais l’app renvoyait des erreurs aux utilisateurs depuis début décembre à cause d’une panne d’OpenSky Network
- En rouvrant l’app, le son de détection d’avion s’est fait entendre à la place de l’erreur 502 qui s’affichait en continu, confirmant que tout refonctionnait normalement
- Le travail sur Aviator 2.0 a ensuite été mené sur deux soirées pour intégrer les idées accumulées jusque-là
Une nouvelle interface de contrôle qui masque moins le radar
- Dans la 2.0, les contrôles ont été déplacés dans un menu séparé, avec les actions importantes en haut et les outils avancés, moins utilisés, en dessous
- Cette structure utilise la divulgation progressive (progressive disclosure)
- Le menu est implémenté comme une modal SwiftUI avec deux
presentationDetentsprimary:0.15de la hauteur de l’écranextended:0.4de la hauteur de l’écran
- L’indicateur de glissement montre que le menu peut être étendu, et
presentationBackgroundInteraction(.enabled)évite que l’interface radar principale soit recouverte par l’ombre - Le
presentationBackgroundreprend l’emboss effect de Paul Hudson pour ajouter une texture métallique rappelant un vrai panneau de contrôle radar - En 2.1, il est prévu d’utiliser TipKit afin que même les jeunes utilisateurs Apple repèrent plus facilement cette structure à divulgation progressive
Ajustement du niveau de zoom et de la portée du radar
- Dans la 1.0, le radar fonctionnait presque trop bien, au point de détecter des avions au-delà de l’horizon ou derrière le relief, donc invisibles en pratique
- Dans un environnement comme la banlieue londonienne, avec son relief en paliers et sa continuité insulaire, cela devenait gênant à l’usage réel
- Comme il restait possible de voir des avions lointains dans des espaces dégagés, le problème ne pouvait pas être réduit à une simple question de sensibilité
- La solution a été d’ajouter une fonction de zoom
- L’implémentation du zoom sur la surface se fait en passant une
distanceen mètres à lacameradu SDK MapKit- si
zoomedest true :70 * 1_000 - sinon :
100 * 1_000
- si
- Pour une implémentation rapide en vue d’une release du week-end, un cercle radar a été retiré afin de mieux souligner l’interface en mode zoomé
- Au départ, l’idée était de gérer le niveau de zoom avec un
Slider, mais même sur une puce A17 la fréquence d’images n’était pas suffisante ; l’app utilise donc aujourd’hui un basculeur de zoom binaire
Fonctions ajoutées grâce aux données d’OpenSky Network
-
Affichage des drapeaux
- L’API OpenSky Network collecte de nombreuses informations via les transpondeurs d’avion, mais la 1.0 n’exploitait pas vraiment ces données
- Dans la 2.0, un bouton permet d’afficher le drapeau emoji du pays d’origine sous chaque icône d’avion
- L’implémentation s’appuie sur la valeur
origin_country - L’app reçoit la chaîne de texte du pays d’origine fournie par l’API
- Elle la convertit en code pays à 2 lettres à partir d’une liste de noms de pays trouvée en ligne
- Le code pays est ensuite converti en scalaires Unicode pour former l’emoji de drapeau
- Quand l’utilisateur active la fonction,
flight.flagest affiché comme texte dans l’annotation MapKit
-
Mode temps couvert
- Lors des journées couvertes au Royaume-Uni, une grande partie des avions affichés dans l’app restaient invisibles car cachés par les nuages
- Un bouton a été ajouté pour masquer les appareils en altitude, permettant de basculer entre un mode ciel dégagé et un mode pluie
- Cette fonction utilise les données d’altitude fournies par OpenSky Network, avec un seuil de base de nuages bas fixé à 2,5 km
- Si
geo_altitude < 2500.0, alorsisLowAltitudevaut true - Si le réglage
cloudyest activé, seules les annotations MapKit des avions à basse altitude sont affichées
Amélioration des icônes d’avion
- Lors d’un test dans un parc, un hélicoptère est passé juste au-dessus de la tête, mais Aviator l’a affiché avec une icône d’avion classique
- L’API OpenSky Network peut fournir l’attribut
category, qui indique le type d’aéronef auquel appartient le transpondeur, si l’on ajoute un paramètre de requête - Cette catégorie peut inclure notamment :
- des aéronefs légers de moins de 15 500 livres
- des aéronefs lourds de plus de 300 000 livres
- des voilures tournantes comme les hélicoptères
- des véhicules spatiaux / transatmosphériques
- des parachutes ou parachutistes
- La dernière mise à jour distingue désormais les classes de taille d’aéronef et affiche des icônes séparées pour les satellites et les hélicoptères
- Dans l’enum
AircraftCategory, les images, emojis et valeurs d’échelle sont séparésrotorcraftutilise le SFSymbolxmark.circle.fillspaceTransatmosphericutilise l’emoji 🛰️small,large,heavyappliquent respectivement les échelles0.6,1,1.5
- L’emoji d’hélicoptère paraissait trop rond une fois converti en aplat monochrome, d’où le choix d’un SFSymbol plus abstrait en forme de croix dans un cercle
- Pour traiter l’emoji comme une image, un
Textest mis à l’échelle puis utilisé comme masque d’unRectangle, auquel sont appliqués la couleur et l’effet d’écran CRT
Identifiants OpenSky Network de l’utilisateur
- Une fonction permet désormais aux utilisateurs de saisir directement leurs identifiants OpenSky Network
- C’était l’une des demandes les plus fréquentes après la version Android, notamment pour éviter le rate limiting de l’usage non authentifié de l’API
- Les informations de compte peuvent être saisies depuis le menu de contrôle complet, avec aussi un lien vers la page d’inscription
- L’interface repose sur
TextFieldetSecureFieldde SwiftUI@AppStorage("username")@AppStorage("password")
- Dans la 2.0, pour aller vite vers la production, le mot de passe est stocké dans User Defaults
- La prochaine release prévoit un stockage dans le Keychain ; en attendant, il ne faut pas réutiliser de mot de passe sensible
- Le nom d’utilisateur et le mot de passe saisis sont encodés en Base64 puis ajoutés à l’en-tête
Authorizationdes requêtes API via l’authentificationBasic
Conclusion
- Aviator 2.0 est une mise à jour qui continue d’améliorer une app pensée pour jouer avec son enfant
- L’auteur invite à proposer en commentaire des idées de fonctionnalités ou des conseils ASO, et demande de télécharger puis d’évaluer Aviator — Radar on your Phone 2.0
1 commentaires
Commentaires sur Hacker News
Il s’agit d’une suite d’un billet qui avait eu pas mal de succès il y a deux mois
0: https://news.ycombinator.com/item?id=38435908 My toddler loves planes, so I built her a radar (1304 points, 56 days ago)
En voyant l’app, ça m’a rappelé des problèmes que j’avais à l’époque où je programmais des DVD. Avec un bouton bascule, on ne sait pas clairement quel mode est actuellement actif
On ne sait pas si l’icône de drapeau ou de nuage montre le mode actuel, ou s’il faut appuyer dessus pour passer à ce mode. Même chose pour la bascule météo : on a l’impression inverse, on ne sait pas si appuyer sur le nuage affiche le mode nuageux ou fait revenir à un écran dégagé
Dans un projet sur lequel je travaille en ce moment, des boutons +/- ajustent aussi la taille de la fenêtre de plage horaire, mais pour l’heure de début, + réduit la valeur en secondes et - l’augmente. Pour l’heure de fin, c’est l’inverse. Du point de vue de la taille de la fenêtre, les deux comportements sont cohérents, donc il faut au final bien clarifier le point de vue de l’utilisateur
La bascule des sous-titres YouTube alterne aussi entre texte blanc sur fond noir et texte noir sur fond blanc, donc il faut appuyer, puis si les lèvres bougent mais qu’aucun sous-titre n’apparaît, essayer l’autre état de l’icône
J’ai l’impression qu’avec le passage aux écrans tactiles, le bon sens autour du retour d’entrée positionnel avec état a disparu
Et oui, c’était bien source de confusion. Lors d’une correction de bug de dernière minute, j’ai publié l’icône de nuage à l’envers par rapport aux autres
Ce serait vraiment génial que le balayage radar fasse clignoter l’avion lorsqu’il passe dessus, puis que sa position reste fixe en s’estompant progressivement jusqu’au balayage suivant
Il serait aussi intéressant de prendre l’altitude et la position GPS actuelles de l’appareil, puis d’utiliser les bâtiments, collines et altitudes alentours d’OpenStreetMap pour calculer la ligne d’horizon visible selon chaque azimut. On pourrait alors l’afficher sur la carte comme un masquage radar. Un peu comme un sondeur qui passe au-dessus d’un rondin, ou un radar naval avec des bateaux masqués par d’autres navires
Si tu faisais ça, les gens du secteur se gratteraient la tête en se demandant comment un téléphone arrive à faire un balayage radial
[1] https://www.researchgate.net/figure/Occlusion-percentage-for...
C’est une réflexion que j’avais laissée sur le blog, mais en tant que parent d’un jeune enfant, je suis d’accord pour dire que le choix des couleurs est la partie la plus importante
Comme c’est un projet annexe amusant, il y a quelques idées de fonctionnalités qui n’ont peut-être pas encore été implémentées. D’abord, une vue en direct qui utilise l’appareil photo du téléphone et les fonctions AR de l’iPhone pour afficher un point à l’emplacement approximatif de l’avion. J’avais déjà bricolé un peu de code qui le calcule à partir de la position de l’utilisateur et des données ADS-B
Ensuite, on pourrait marquer un avion comme « vu » ou « manqué », et utiliser ce retour pour ajuster ce qui est affiché
Enfin, des badges et des statistiques. Si ta fille ressemble à notre enfant, elle aimera probablement obtenir des badges dans l’app. On pourrait enregistrer l’historique localement dans une base de données et suivre des choses comme « nombre de compagnies aériennes vues », « nombre de types d’appareils vus », « vol le plus long », « vol le plus court ». Cela dit, je comprends tout à fait les problèmes que pose la gamification dans une app destinée aux enfants
Je lui explique souvent pourquoi il ne faut pas dépenser 30 dollars en monnaie numérique comme les Robux. Ce n’est pas la même chose que des objets ayant une vraie valeur, comme une raquette de tennis ou des chaussures
C’est pour ça que je résiste à la gamification et que j’essaie de lui donner des outils pour ne pas se laisser aspirer dans des heures de tâches répétitives juste pour obtenir des badges ou des artefacts numériques sans valeur
Pour une app destinée aux enfants, il vaudrait mieux ne pas inclure ce genre de fonctions. On peut montrer qu’il existe des apps sans publicité, sans gamification, qui ajoutent pourtant une vraie valeur à la vie
Y aurait-il parmi les gens de HN quelqu’un pour lancer un projet open source participatif afin de porter ça sur Android ?
Je suppose pour la licence que la personne qui créera le dépôt GitHub initial pourrait reprendre la phrase de l’auteur : « j’attends qu’un ingénieur Android entreprenant le porte lui-même ; j’ai mis assez de détails dans le billet. Vous pouvez le faire tant que c’est gratuit pour tout le monde »
Même si je ne pouvais pas contribuer à une app Android de haute qualité pour ce radar, ce serait sans doute bien employé de consacrer du temps à porter quelque chose qui s’inscrive dans le paradigme « An app can be a home-cooked meal »[0]. Comme c’est conçu autour d’une vision et d’un paradigme uniques, sans lourdeur, publicité, tracking, etc., le code a de bonnes chances d’être plus facile à comprendre
Cette proposition pourrait même me conduire à retrouver le plaisir de programmer
0: https://news.ycombinator.com/item?id=38877423
C’est un peu un autre sujet, mais en tant que personne avec un mauvais sens de l’orientation, la fonction la plus importante sur un téléphone est à quel point la petite flèche sur la carte indique précisément la direction dans laquelle je regarde
J’utilise Android, et quand il n’est pas sûr, il affiche un cône d’incertitude bleu, et parfois il me demande de bouger le téléphone en forme de 8 ou de pointer les bâtiments autour de moi pour le recalibrer
Techniquement, quelle est la limite ici ? L’iPhone est-il meilleur qu’Android ? Est-ce le matériel, l’accéléromètre, la boussole, le signal GPS ou le logiciel qui pose problème ? Je suis encore assez souvent désorienté et le cône pointe dans une mauvaise direction. Si l’iPhone fait vraiment mieux, c’est assez important pour que je sois presque prêt à changer
Je pensais qu’il devait y avoir une limite du côté du GPS, mais le delegate de direction de CoreLocation renvoie une orientation parfaite, du moins au taux de rafraîchissement de 120 Hz de mon appareil
Google Maps est peut-être simplement médiocre
Les deux se trompent à peu près aussi souvent sur la valeur d’orientation. Mais ce n’est qu’une impression basée sur l’expérience d’usage, pas un fait établi
Sur les anciennes versions d’iOS, la flèche lente était assez agaçante, mais maintenant que le matériel est plus rapide, la flèche qui saute des autres plateformes se remarque davantage
En résumé, la plupart des matériels récents ont des capacités assez comparables pour déterminer leur position dans l’espace et le temps. En revanche, la qualité de l’estime de trajectoire et de l’estimation d’attitude à partir des données courantes, ainsi que la manière de gérer le filtrage du bruit attendu par l’utilisateur quand le téléphone est tenu à la main, varient d’un logiciel de navigation à l’autre
C’est à cause des jeux Tony Hawk que je me suis mis au heavy metal. Motörhead avec “Ace of Spades” dans THPS3 et Iron Maiden avec “Number of the Beast” dans THPS4 ont été le déclic, donc il existe peut-être une piste de miettes de pain menant des jeux de plateforme au heavy metal
Beau travail, au sens où l’utilisateur le plus important a clairement été rendu heureux
Génial. En plus, ça me donne envie de mettre un
!remindmedans 18 ans pour vérifier si ta fille a réussi l’examen de contrôle aérienJe me demande si, même dans le monde d’après le 11-Septembre, les enfants peuvent encore être invités dans le cockpit
Je me souviens vaguement d’avoir appuyé sur un bouton pendant que mon père me montrait les instruments qui bougeaient. Mais le sentiment très net, en retournant à mon siège, d’être le plus grand enfant du monde, lui, est resté
Après le 11-Septembre, ce genre de chose est clairement devenu beaucoup plus difficile
En revanche, après l’atterrissage, demander si l’enfant peut voir le cockpit a beaucoup plus de chances de marcher
En vol, même le personnel de cabine n’y entre presque jamais, sauf parfois le chef de cabine. Les enfants demandent quand ils embarquent, si la porte du cockpit est encore ouverte
C’était sur un vol intérieur JetBlue aux États-Unis
J’ai encore quelque part l’insigne en forme d’ailes de Delta qu’on m’a donné après avoir vu le cockpit pendant un vol quand j’étais enfant. C’était une expérience formidable dont je me souviens encore, et j’espère que d’autres enfants pourront en vivre au moins une partie