1 puntos por GN⁺ 2024-01-23 | 1 comentarios | Compartir por WhatsApp
  • 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 y category, 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 presentationDetents
    • primary: 0.15 de la altura de la pantalla
    • extended: 0.4 de 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 presentationBackground se 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 distance en metros a la camera del SDK de MapKit
    • si zoomed es true: 70 * 1_000
    • si es false: 100 * 1_000
  • 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.flag como 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, isLowAltitude pasa a ser true
    • Si la configuración cloudy está 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 AircraftCategory se separaron imagen, emoji y valor de escala
    • rotorcraft usa el SFSymbol xmark.circle.fill
    • spaceTransatmospheric usa el emoji 🛰️
    • small, large y heavy aplican escalas de 0.6, 1 y 1.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 Text y luego se usa como máscara de un Rectangle, 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 TextField y SecureField de 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 Basic en el encabezado Authorization de 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

 
GN⁺ 2024-01-23
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

    • Esta es justo la parte de la UX moderna que más detesto, y es especialmente grave en apps de TV. Si de dos elementos de menú uno está en blanco en negrita y el otro en negro en negrita, no sé qué estoy a punto de hacer clic
      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
    • Es una observación acertada. Creo que me obsesioné un poco con que pareciera un panel de control, más que con hacer una buena UX
      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...

    • Todas esas ideas son buenas. La app actual se parece más a una versión Pareto del 100% de lo que potencialmente podría ser
  • 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

    • Puede sonar un poco anticuado, pero intento recordarle constantemente a mi hijo que aspire a ser productor de tecnología, no solo consumidor
      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
    • Muchas gracias por las ideas. Me pregunto si podré conseguir un Vision Pro para la número 1
  • ¿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”

    • Gracias por esta propuesta. Nunca he creado una app móvil, pero me gustaría aprender
      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
    • No tengo capacidad para mantenimiento a largo plazo, pero creo que podría aportar un poco. Mi correo está en el perfil
  • 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.

    • Me alegra que lo menciones. En el texto original hice la misma observación.
      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.
    • Como alguien que usa ambos con frecuencia similar, Android tiende a pasar los valores crudos de los sensores tal cual, mientras que iOS parece meter una especie de retardo de debounce y estimación.
      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.
    • Los productos de Apple y sus animaciones en general aplican más suavizado e histéresis. Parece que ocultan precisión al usuario para que la flecha no tiemble demasiado, mientras que la UI de Android parece mostrar más directamente los artefactos que surgen de la fusión GPS/IMU ruidosa y de la imprecisión inherente del magnetómetro.
      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 !remindme para verificar dentro de 18 años si su hija aprobó el examen de control de tráfico aéreo.

    • Ahora tiene 2 años, y la licencia de piloto estudiante se puede obtener a partir de los 16, así que el recordatorio debería ser para dentro de 14 años.
    • Si su hija se vuelve piloto, ¿pueden recibir vuelos gratis? Tal vez se estén perdiendo una oportunidad de empujarla sutilmente hacia STEM.
  • Me pregunto si, incluso en el mundo posterior al 9/11, los niños todavía pueden ser invitados a la cabina de mando.

    • Mi padre era piloto, y solíamos organizar las vacaciones familiares según su itinerario de vuelos. Cuando era niño, nada me hizo sentir más orgulloso que el momento en que me invitaron a la cabina después del pushback para “arrancar los motores”.
      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.
    • Vi en internet el consejo de que, si un niño quiere ver la cabina, es mejor no preguntar antes del despegue. En ese momento los pilotos tienen mucho que hacer con las listas de verificación y los preparativos.
      En cambio, si después del aterrizaje preguntas si el niño puede ver la cabina, las probabilidades de éxito son mucho mayores.
    • Mis hijos sí han entrado a la cabina después del 9/11. Pero tiene que ser antes del despegue.
      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.
    • El 1 de enero de 2024, un niño de seis años fue invitado por primera vez a la cabina. Hasta ese momento yo tenía la misma duda.
      Fue en un vuelo nacional de JetBlue en Estados Unidos.
    • He visto que eso ocurra cuando el avión está en la puerta. Los pilotos suelen dejar la puerta abierta, así que uno puede acercarse y hablarles. En el peor de los casos te dicen que no, así que vale la pena preguntar.
      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.