Mi hijo todavía ama los aviones, así que actualicé el radar
(substack.com/jacobbartlett)- La app personal de radar para iOS Aviator 2.0 vuelve a funcionar después de la interrupción de OpenSky Network que venía desde principios de diciembre, y es una actualización que corrige de una vez varias molestias detectadas durante el uso real
- El nuevo menú de controles usa una estructura de revelación progresiva para separar las acciones principales de las herramientas avanzadas, y está diseñado para tapar menos la pantalla del radar mediante modal detents de SwiftUI e interacción con el fondo
- El problema de detectar aeronaves demasiado lejanas se redujo con un interruptor binario de zoom, implementado cambiando la distancia de la cámara de MapKit a 70 km o 100 km
- Con datos de la API de OpenSky Network como
origin_country, altitud ycategory, se agregaron banderas, un filtro de baja altitud para días nublados y diferenciación de íconos para helicópteros, satélites y tamaños de aeronave - Los usuarios pueden usar autenticación HTTP Basic con sus datos de inicio de sesión de OpenSky Network, pero en la versión 2.0 la contraseña se guarda en User Defaults, por lo que conviene evitar reutilizar contraseñas sensibles
Contexto de la actualización Aviator 2.0
- Aviator — Radar on your Phone es una app de radar para iOS creada para buscar aviones junto con mi hijo
- Después del artículo anterior, podría haber pensado en un nuevo lanzamiento y oportunidades de monetización, pero desde principios de diciembre la app estaba mostrando errores a los usuarios por una interrupción de OpenSky Network
- Al volver a abrir la app, en lugar del error 502 que aparecía constantemente, escuché el sonido de alerta de detección de aviones y confirmé que funcionaba con normalidad
- Después de eso, durante dos noches trabajé en Aviator 2.0, incorporando ideas existentes
Nueva UI de controles que tapa menos el radar
- En la versión 2.0, los controles se movieron a un menú separado, con las acciones importantes al frente y las herramientas avanzadas, que se usan con menos frecuencia, ubicadas más abajo
- Esta estructura usa revelación progresiva (progressive disclosure)
- El menú está implementado como un modal de SwiftUI y tiene dos
presentationDetentsprimary:0.15de la altura de la pantallaextended:0.4de la altura de la pantalla
- El indicador de arrastre muestra que el menú se puede expandir, y con
presentationBackgroundInteraction(.enabled)se evita que la UI principal del radar quede cubierta por una sombra - En
presentationBackgroundse aplicó el efecto emboss de Paul Hudson para sumar una textura metálica similar a la de un panel de control de radar real - En la versión 2.1, se planea usar TipKit para que incluso los usuarios jóvenes de Apple puedan notar la estructura de revelación progresiva
Ajuste del nivel de zoom y del alcance del radar
- En la versión 1.0, el radar funcionaba demasiado bien y detectaba incluso aeronaves que no podían verse porque estaban más allá del horizonte o detrás del terreno
- En entornos con terreno escalonado y una disposición tipo isla, como las afueras de Londres, esto se volvió una molestia en el uso real
- Como en espacios abiertos sí era posible ver aviones lejanos, era difícil considerarlo simplemente un problema de sensibilidad
- La solución fue agregar una función de zoom
- Se implementó el acercamiento y alejamiento de la superficie pasando una
distanceen metros a lacameradel SDK de MapKit- si
zoomedes true:70 * 1_000 - si es false:
100 * 1_000
- si
- Para implementarlo rápidamente de cara al lanzamiento del fin de semana, se eliminó un círculo del radar con el fin de enfatizar la UI ampliada
- Al principio se intentó manejar el nivel de zoom con un
Slider, pero ni siquiera con el chip A17 se obtenía un framerate suficiente, así que por ahora se usa un interruptor binario de zoom
Funciones agregadas con datos de OpenSky Network
-
Visualización de banderas
- La API de OpenSky Network recopila distintos datos desde los transpondedores de las aeronaves, pero en la versión 1.0 esos datos no se aprovechaban lo suficiente
- En la versión 2.0 se agregó un interruptor para mostrar el país de origen debajo de cada ícono de avión como una bandera emoji
- La implementación se basa en el valor
origin_country - Se recibe la cadena de texto del país de origen que entrega la API
- Se convierte a un código de país de 2 letras usando una lista de nombres de países encontrada en línea
- El código de país se convierte en escalares Unicode para formar el emoji de la bandera
- Cuando el usuario activa la función, se muestra
flight.flagcomo texto en la annotation de MapKit
-
Modo para días nublados
- En los días nublados del Reino Unido, muchos de los aviones que aparecían en la app quedaban ocultos por las nubes y no se veían en la práctica
- Se agregó un botón para ocultar aeronaves altas, permitiendo alternar entre modo despejado y modo lluvioso
- Usa los datos de altitud recibidos desde OpenSky Network y toma 2.5 km como valor base para nubes bajas
- Si
geo_altitude < 2500.0,isLowAltitudepasa a ser true - Si la configuración
cloudyestá activada, solo se muestran aeronaves de baja altitud en las annotations de MapKit
Mejoras en los íconos de aeronaves
- Durante una prueba en un parque, pasó un helicóptero por encima, pero Aviator lo mostró con el ícono de un avión común
- La API de OpenSky Network ofrece el atributo
category, que indica el tipo de aeronave al que pertenece el transpondedor, si se agrega un parámetro de consulta - Esta categoría puede incluir elementos como los siguientes
- Aeronaves ligeras de menos de 15,500 libras
- Aeronaves pesadas de más de 300,000 libras
- Aeronaves de ala rotatoria, como helicópteros
- Vehículos espaciales/transatmosféricos
- Paracaídas o paracaidistas
- En la actualización más reciente se distinguen clases de tamaño de aeronave y se muestran satélites y helicópteros con íconos separados
- En el enum
AircraftCategoryse separaron imagen, emoji y valor de escalarotorcraftusa el SFSymbolxmark.circle.fillspaceTransatmosphericusa el emoji 🛰️small,largeyheavyaplican escalas de0.6,1y1.5, respectivamente
- Como el emoji de helicóptero se veía demasiado redondo al convertirlo en un plano monocromático, se eligió un SFSymbol más abstracto: una cruz dentro de un círculo
- Para tratar el emoji como imagen, se escala
Texty luego se usa como máscara de unRectangle, aplicándole color y un efecto de pantalla CRT
Inicio de sesión de usuario en OpenSky Network
- Se agregó una función para que los usuarios ingresen directamente sus credenciales de OpenSky Network
- Era una de las funciones más pedidas después de la versión para Android, y su objetivo es evitar el rate limiting del uso no autenticado de la API
- La cuenta se puede ingresar desde el menú completo de controles, que también ofrece un enlace a la página de registro
- Está implementado con
TextFieldySecureFieldde SwiftUI@AppStorage("username")@AppStorage("password")
- En la versión 2.0, al llevarlo rápidamente a producción, la contraseña se guarda en User Defaults
- En el próximo lanzamiento se planea guardarla en Keychain, y por ahora no se deben reutilizar contraseñas sensibles
- El nombre de usuario y la contraseña ingresados se codifican en Base64 y se adjuntan como autenticación
Basicen el encabezadoAuthorizationde las solicitudes a la API
Cierre
- Aviator 2.0 es una actualización para seguir mejorando una app con la que jugar junto con mi hijo
- Se piden en los comentarios ideas de funciones o tips de ASO, así como descargar y reseñar Aviator — Radar on your Phone 2.0
1 comentarios
Comentarios de Hacker News
Es la continuación de un artículo que fue bastante popular hace dos meses
0: https://news.ycombinator.com/item?id=38435908 My toddler loves planes, so I built her a radar (1304 points, 56 days ago)
Al ver la app me acordé de un problema que tenía en la época en que programaba DVDs. En los botones de alternancia, no queda claro qué modo está activo actualmente
Es confuso si el ícono de la bandera o de la nube muestra el modo actual, o si hay que presionarlo para cambiar a ese modo. Con el toggle del clima también se siente al revés: no se sabe si tocar la nube significa que se quiere ver el modo nublado o cambiar a una pantalla despejada
En un proyecto en el que estoy trabajando ahora, los botones +/- ajustan el tamaño de una ventana de rango de tiempo: en la hora de inicio, + reduce el valor de los segundos y - lo aumenta. En la hora de fin es al revés. Desde el punto de vista del tamaño de la ventana, ambos funcionan como se espera, así que al final hay que dejar clara la perspectiva del usuario
El toggle de subtítulos de YouTube también alterna entre texto blanco sobre fondo negro y texto negro sobre fondo blanco, así que primero hay que presionarlo y, si la boca se mueve pero no aparecen subtítulos, probar el otro modo del ícono
Siento que, al pasarnos a las pantallas táctiles, se perdió el sentido común sobre la retroalimentación de entrada posicional con estado
Además, sí estaba confuso. En una corrección de bug de último momento, publiqué el ícono de la nube al revés respecto de los demás
Sería genial que, cuando el barrido del radar pase sobre un avión, este parpadee y luego se desvanezca lentamente hasta el siguiente barrido, manteniendo su posición fija
También estaría bueno usar la altitud y ubicación GPS actuales del dispositivo y, con los edificios, colinas y elevaciones cercanas de OpenStreetMap, calcular el skyline visible por acimut. Así se podría mostrar sobre el mapa como una especie de ocultamiento del radar. Algo al estilo de un sonar de pesca atravesando troncos, o un radar de barco oculto por otros barcos
Si lo hicieras, la gente de la industria se quedaría rascándose la cabeza pensando cómo un teléfono hace un escaneo radial
[1] https://www.researchgate.net/figure/Occlusion-percentage-for...
Es algo que comenté en el blog, pero como padre de un niño pequeño coincido en que la elección de colores es lo más importante
Como es un proyecto paralelo divertido, tengo algunas ideas de funciones que quizá aún no implementaste. Primero, una vista en vivo que use la cámara del teléfono y las funciones de AR del iPhone para mostrar un punto en la ubicación aproximada del avión. Alguna vez escribí un poco de código que lo calcula con la ubicación del usuario y datos ADS-B
Segundo, también se podría marcar una aeronave como “vista” o “perdida” y usar ese feedback para ajustar lo que se muestra
Tercero, insignias y estadísticas. Si tu hija se parece a mi hijo, le va a encantar recibir insignias en la app. Se podrían guardar las observaciones anteriores en una DB local y rastrear cosas como “cantidad de aerolíneas vistas”, “cantidad de tipos de aeronaves vistos”, “vuelo más lejano” y “vuelo más corto”. Dicho eso, entiendo perfectamente los problemas de gamificar una app para niños
Hablamos seguido de por qué no conviene gastar 30 dólares en monedas digitales como Robux. Le explico que no es lo mismo que objetos con valor real, como una raqueta de tenis o unos zapatos
Por eso me resisto a la gamificación, y trato de darle herramientas para que no quede atrapado durante horas haciendo tareas repetitivas para conseguir insignias o artefactos digitales sin valor
Si es una app para niños, preferiría no incluir ese tipo de funciones. Puede mostrar que existen apps sin anuncios ni gamificación que aun así agregan valor real a la vida
¿Habrá gente en HN interesada en hacer un proyecto open source y crowdsourced para portar esto a Android?
Sobre la licencia, solo estoy especulando, pero creo que quien cree el repositorio inicial en GitHub podría usar la frase del autor: “estoy esperando a que algún ingeniero Android emprendedor lo porte por su cuenta. Puse suficientes detalles en el artículo. Pueden hacerlo siempre que lo ofrezcan gratis para todos”
Aunque no logre contribuir a esta app de radar con una app Android de alta calidad, creo que valdría la pena dedicar tiempo a portar algo que encaje con el paradigma de “An app can be a home-cooked meal”[0]. Al estar construido con una visión y un paradigma únicos, y sin bloat, anuncios ni rastreo, es probable que el código sea fácil de entender
Esta propuesta podría llevarme a redescubrir el placer de programar
0: https://news.ycombinator.com/item?id=38877423
Es un poco otro tema, pero como alguien con mal sentido de orientación, para mí la función más importante del celular es qué tan exactamente muestra la flechita en el mapa hacia qué lado estoy mirando.
Uso Android, y cuando no está seguro me muestra un cono de incertidumbre azul, y a veces me pide calibrarlo moviendo el teléfono en forma de 8 o apuntando a edificios cercanos.
Técnicamente, ¿cuál es la limitación aquí? ¿El iPhone es mejor que Android? ¿El problema es el hardware, el acelerómetro, la brújula, la señal GPS o el software? Todavía se confunde con bastante frecuencia y muestra el cono apuntando hacia cualquier lado. Si el iPhone realmente lo hace mucho mejor, es algo lo suficientemente importante como para casi hacerme cambiar.
Pensé que habría alguna limitación del lado del GPS, pero el delegado de dirección de CoreLocation devuelve la orientación perfectamente, al menos a la tasa de 120 Hz de mi dispositivo.
Puede que Google Maps simplemente no sea muy bueno.
En ambos, la orientación se equivoca con una frecuencia parecida. Aunque es una estimación basada en mi experiencia de uso, no un hecho definitivo.
En iOS antiguo, la flecha lenta era bastante molesta, pero ahora que el hardware se volvió más rápido, la flecha saltarina de otras plataformas se nota más.
En resumen, la mayoría del hardware moderno tiene capacidades parecidas para ubicarse con bastante precisión en el espacio y el tiempo. Pero qué tan bien hace navegación por estima y estimación de actitud con los datos actuales, y cómo maneja el filtrado de ruido que el usuario espera cuando lo lleva en la mano, varía según el software de navegación.
Me metí en el heavy metal por los juegos de Tony Hawk. Motörhead “Ace of Spades” en THPS3 e Iron Maiden “Number of the Beast” en THPS4 fueron el disparador, así que puede existir un camino de migas de pan desde los juegos de plataformas hasta el heavy metal.
Bien hecho por asegurarse de hacer feliz a su usuario más importante.
Genial. Además, me dan ganas de poner un
!remindmepara verificar dentro de 18 años si su hija aprobó el examen de control de tráfico aéreo.Me pregunto si, incluso en el mundo posterior al 9/11, los niños todavía pueden ser invitados a la cabina de mando.
Recuerdo vagamente haber presionado un botón y que mi padre me señalara los instrumentos que se movían. Lo que sí recuerdo con claridad es que, al volver a mi asiento, me sentía como el niño más grande del mundo.
Después del 9/11, eso seguramente sería difícil que ocurriera.
En cambio, si después del aterrizaje preguntas si el niño puede ver la cabina, las probabilidades de éxito son mucho mayores.
Durante el vuelo casi no dejan entrar ni a la tripulación, y a veces solo puede entrar el jefe de cabina. Mis hijos preguntan al embarcar si la puerta de la cabina todavía está abierta.
Fue en un vuelo nacional de JetBlue en Estados Unidos.
Todavía tengo por ahí una insignia con alas de Delta que me dieron de niño cuando, durante un viaje, pude ver la cabina en ruta. Fue una experiencia genial que aún recuerdo, y me gustaría que otros niños pudieran experimentar aunque sea una parte de eso.