Desarrollo de una app nativa para iOS
Crear una app para registrar bici y carrera
- Publicado
- Actualizado
- (creado )
- Escrito por
- Willem L. Middelkoop
- Temas
- AI · apple · bici · crear · datos · diseño · gran fondo · salud · corazón · minimalista · programación · running · sensores · deporte · reloj
- Versión humana de este artículo
- https://willem.com/es/2024-05-11_desarrollo-de-una-app-nativa-para-ios/
- English
- Developing a native iOS app
- Nederlands
- Het ontwikkelen van een native iOS app
- Deutsch
- Entwicklung einer nativen iOS-App
- Français
- Développer une appli iOS native
- Italiano
- Sviluppare un'app iOS nativa
- Português
- Desenvolver uma app iOS nativa
- Papiamentu
- Desaroyá un app iOS nativo
- Frysk
- In native iOS app ûntwikkelje
- Idiomas
- Traducido del original en inglés por un modelo de lenguaje en dos pasadas (traducción y corrección) con un glosario y un corrector ortográfico; aún no revisado por un hablante nativo.
Resumen
Como pequeño proyecto paralelo, robando tiempo a mi trabajo de siempre, he estado trabajando en algo que me interesa a título personal: una app nativa para iOS que registra entrenamientos. Quería dejar obsoleto mi smartwatch y usar el móvil para registrar mis entrenamientos. ¿Qué dificultad podía tener recoger datos detallados de sensores con las API nativas de Swift?
Texto completo
Antecedentes
Si sigues mi blog, no te sorprenderá: me encanta montar en bici y hace poco empecé a correr. Tengo bastante experiencia registrando mis entrenamientos con Garmin, Strava, Omata, Wahoo, Biostrap, Whoop y varias apps y sensores. Los datos de salud y forma física me parecen útiles para conocer tu rendimiento físico y para tener cierto compromiso contigo mismo (por ejemplo, que te motive a seguir entrenando).

El friki que llevo dentro adora los grandes conjuntos de datos, y la variedad de sensores disponibles es un festín para mi curiosidad, pero choca con mi deseo de minimalismo y de sencillez. ¿De verdad necesitas todos los datos de tus entrenamientos? ¿No basta con escuchar a tu cuerpo? No lo sé, pero aprecio que un smartwatch pueda registrar entrenamientos con mucho detalle y (casi) sin esfuerzo. Me gusta cómo se puede usar el Apple Watch para registrar entrenamientos, además de ser un moderno reloj de herramientas y un sustituto del móvil. Entiendo que la mayoría de la gente se pone el smartwatch y ya está, pero a mí me gustan los relojes mecánicos de toda la vida, como un Rolex, un Tudor, un Grand Seiko o incluso algo hecho a medida. Aunque aprecio los dos, si tengo que elegir me inclino por los relojes mecánicos cuando toca elegir entre smartwatches y relojes mecánicos.
Idea para la app: Gran Fondo
¿Y si hubiera una app para el móvil que recogiera todos los datos de entrenamiento que quieres, sin líos ni ruido? Me la imaginé así:
- Sencilla: tiene que 'apartarse de tu camino', pensada para 'funcionar sin más', sin tener que trastear con ajustes u opciones interminables. Solo pulsa 'iniciar' y empieza a entrenar.
- Flexible: úsala como quieras: pon el móvil a la vista, en un soporte o en el brazo, para ver los datos en tiempo real, o guárdalo en el bolsillo y deja que trabaje en segundo plano.
- Potente: conecta sensores de frecuencia cardíaca, cadencia, potencia y velocidad por Bluetooth; admite varios sensores, ideal si usas distintas bicis.
- Amiga de Apple Health: guarda todos los datos en Apple Health con el máximo detalle, incluidas las rutas y las mediciones individuales de potencia, cadencia y velocidad. Así puedes analizar las grabaciones en cualquier app compatible con Apple Health, como Strava, WHOOP, HealthFit y muchas más.
- Honesta: sin anuncios ni venta de datos. Sin cuentas ni registro. Tus datos deben seguir siendo privados, seguros y estar en tu dispositivo.
Ninguna de las apps de deporte y fitness que existen para el móvil cumple todo esto. La mayoría son innecesariamente complejas o están diseñadas, de un modo u otro, para quedarse con tus datos en beneficio del creador de la app o de su plataforma. ¿Podía hacerlo mejor?
Construir la app
Sabiendo por qué y qué quería, me puse a elegir cómo construirla.
Nativa frente a app híbrida/web
En casi todo mi trabajo prefiero usar tecnologías web abiertas y libres (libres de verdad), como HTML, JavaScript y CSS, o software de servidor publicado con una licencia de software libre como la GPL. Pero para este caso necesitaba un consumo de energía mínimo y una integración profunda con el sistema operativo del móvil. La mejor forma de lograrlo en un iPhone es adoptar por completo el kit de desarrollo de Apple: hacer la app de forma nativa en Swift con SwiftUI y seguir lo más fielmente posible la documentación técnica y las pautas de diseño.
Programación asistida por IA
Aunque tengo mis reservas, programar con IA acapara toda la atención últimamente. Hay quien dice incluso que tecnologías como Copilot o ChatGPT dejarán obsoletos a los programadores. Yo conozco bien la IA: la he usado para generar código y enseño a la gente a usarla, pero nunca la había usado para construir una app de iOS completa. Pensé que sería la oportunidad perfecta para ver si la IA vale para algo más complejo que un fragmento de script. Vamos a ver cuán obsoleto estoy como programador en esta era de la IA...
GPS y sensores Bluetooth Low Energy
Con mi entorno de Xcode ya montado, le pedí a ChatGPT de OpenAI que me diera código para leer los datos de ubicación GPS y que generara las clases de Swift necesarias para detectar sensores Bluetooth y conectarse a ellos. ¡Y vaya si caí en la famosa madriguera del conejo!

Lo de programar con ayuda de la IA es que SÍ funciona, pero solo EN PARTE. Te da piezas que funcionan, pero no encajan del todo y no necesariamente funcionan juntas. Ver el código que genera es como oír los ecos de una gran canción: reconoces que se parece a algo, pero no es lo mismo que ver a la banda tocar en directo, ¡y ni hablar de cantarla tú mismo!
Cogí las piezas de la IA y me puse a leer yo mismo la documentación pertinente, y resultó mucho más eficaz, porque así entendí de verdad qué debía hacer el mecanismo. La IA me ayudó a encontrar lo que necesitaba aprender. Registrar la ubicación GPS fue sorprendentemente fácil con CoreLocation de Apple. Conseguir que el sensor Bluetooth se conectara a la app resultó mucho más difícil, porque implica muchos pasos distintos:
- Detectar dispositivos Bluetooth: escanear los alrededores en busca de dispositivos disponibles que estén emitiendo
- Conectarse a un dispositivo Bluetooth: establecer y mantener una conexión entre la app y el dispositivo
- Descubrir las características del dispositivo Bluetooth: no existe un dispositivo Bluetooth simple, tienes que 'descubrir' tú mismo las capacidades y funciones del dispositivo; muchos emiten varias señales distintas, tanto de datos del sensor como de mecanismos de control y parámetros de funcionamiento, como el nivel de batería.
- Suscribirse a las características: al final te suscribes a un flujo de datos sintonizando la radio Bluetooth con una característica concreta.
- Decodificar los datos: por su naturaleza de bajo consumo, recibes datos mínimos en bits sin procesar; tienes que decodificar tú los paquetes de datos; lo difícil es que cada sensor, de cada fabricante, codifica los datos a su manera.
Tomemos un sensor relativamente 'simple', como un sensor de cadencia que se coloca en el pedal de la bici y sirve para saber las revoluciones por minuto durante una salida. ¿Qué dificultad puede tener? Pensé que la especificación oficial de Bluetooth me daría todos los detalles... ¡NI DE BROMA! Un sensor de cadencia sencillo es sorprendentemente complejo:
- Perfil Bluetooth combinado de velocidad y cadencia en ciclismo: cualquier sensor de cadencia se identifica siempre como sensor de velocidad y de cadencia, y sus capacidades hay que descubrirlas 'sobre la marcha'.
- Paquetes de datos desiguales: el contenido de los datos depende de lo que el sensor pueda hacer en ese momento (por ejemplo, si ha detectado algo); tienes que interpretar el paquete bit a bit, comprobando los posibles indicadores que dicen qué representa el siguiente bit.
- Datos nada triviales: no esperes un valor claro de “cadencia”; el sensor te da un recuento acumulado de revoluciones y una marca de tiempo rudimentaria del último cambio detectado; con esos valores tienes que calcular la métrica que quieres medir.
La IA me dio código de ejemplo, pero no funcionaba con mi sensor. Con una app de depuración Bluetooth, Bluefy, conseguí entender mejor los datos que transmitía el sensor. En el blog oficial de Bluetooth encontré un trozo de código en Java que me dio pistas para interpretar los datos de los sensores. Lo adapté a varios perfiles de sensor distintos y lo traduje a Swift. Así obtuve un primer prototipo funcional.

Diseño de UI/UX
Una de las razones principales por las que me gusta la app de entrenamiento del Apple Watch es que su interfaz de usuario (UI) está pensada para dar una experiencia de usuario (UX) agradable. La app del reloj tiene botones bastante grandes que pulsas para iniciar una grabación, y poco más. Tiene pocas opciones, su diseño tiene personalidad pero está muy bien pensado. Es un contraste enorme con dispositivos como Garmin, que ofrecen un montón de opciones de personalización. El truco está en encontrar un buen equilibrio entre la flexibilidad para distintos usos y una configuración por defecto que funcione bien.

Con un sistema de anclaje como QuadLock puedes sujetar el móvil con firmeza al manillar. Así el iPhone puede sustituir a tu ciclocomputador Garmin. Los iPhone modernos tienen una pantalla siempre activa que muestra información con poco consumo, siempre que uses el kit de desarrollo de Apple, que trae varias optimizaciones integradas. Después de muchos, muchísimos kilómetros con mi ciclocomputador Garmin, me quedé con una vista con campos de datos en tiempo real de velocidad, potencia y frecuencia cardíaca. Lo que me gusta de los Garmin Edge más avanzados es que pueden dibujar una gráfica. Así mantienes los ojos en la carretera cuando importa y echas un vistazo a los datos históricos un poco más tarde.



Para maximizar la eficiencia energética decidí usar las bibliotecas de gráficos de Apple: Swift Charts. Un problema que me encontré es que las mediciones de los sensores llegan en intervalos y momentos distintos. Hace falta algún mecanismo de sincronización para que los puntos de datos coincidan en marcas de tiempo comunes y se puedan comparar y relacionar. Diseñé este mecanismo para sincronizar también las actualizaciones de la interfaz: todas las gráficas y todos los puntos de datos se actualizan en un único refresco, optimizando el rendimiento de CPU y gráficos (y por tanto la batería). Como extra, añadí compatibilidad con distintos intervalos de tiempo, de modo que las gráficas pueden mostrar el último minuto, 5 minutos, 15 minutos, una hora o todo el entrenamiento.

La app muestra automáticamente las gráficas disponibles según los sensores conectados, así que no necesitas configuraciones distintas si tienes más de una bici. Si tocas una gráfica, se maximiza o se minimiza. Si tocas el intervalo de datos (por ejemplo “últimos 5 minutos”), puedes alternar entre intervalos. La app recuerda tu configuración y te la deja lista para el siguiente entrenamiento. Como todos los botones y zonas táctiles son bastante grandes, funcionan bien con las manos sudadas o con guantes.
Cabe en el bolsillo: optimizar el uso en segundo plano y el consumo de energía
Otra forma de usar la app que imaginé era llevarla en el bolsillo, como app en segundo plano. Así se recogen datos de forma discreta: arrancas la app y te guardas el móvil. Me encanta la idea de tener un 'conjunto de datos completo' de todas mis salidas en bici y carreras sin que la app tenga que estar en primer plano todo el rato. Muchos entrenamientos y salidas no son tan interesantes.

De forma predeterminada, el sistema operativo iOS de Apple limita estrictamente lo que pueden hacer las apps en segundo plano. Eso maximiza la batería y la privacidad del usuario. Si sigues las pautas de Apple y pides correctamente al usuario los permisos necesarios, puedes diseñar tu app para que funcione a la perfección en segundo plano. Aprecié mucho el esfuerzo de Apple por optimizar toda la pila, que permite que tu app sea más eficiente energéticamente. En pocas palabras, el sistema operativo aplica el principio de “no nos llames, nosotros te llamamos”: toma el control de cuándo hace su trabajo tu app, y así puede sincronizar, combinar y procesar por lotes distintas tareas en los núcleos eficientes de los chips Apple Silicon.
En una de las pruebas con una versión prototipo de la app conseguí recopilar más de 127.000 (!!) puntos de datos durante una salida larga de 8 horas con una sola carga de batería del iPhone, con la pantalla encendida todo el tiempo. Si juegas según las reglas de Apple, tienes la potencia de verdad (por así decirlo). Desarrollar esta app me ha llevado lejos, ¡ja!

Los artistas de verdad publican
El camino al infierno está empedrado de buenas intenciones, dicen... Por eso me gusta terminar mis proyectos. Para una app, eso significa publicarla en la App Store. Prepararla para el escrutinio de Apple y conseguir que la aprueben los revisores de la App Store es un hito más. Es importante, porque te obliga a pensar en la incorporación (de los nuevos usuarios) y en el modelo de ingresos.
Incorporación
Una tarea especialmente difícil al construir una app es guiar a quienes la usan por primera vez. Una buena interfaz ayuda, pero dada la profunda integración de la app con Apple Health, los datos de ubicación y los sensores Bluetooth, hay que pedir además los permisos, con educación.

Tienes que diseñar el proceso para que no falle cuando alguien rechaza algún permiso. Apple es muy estricta en esto: la gente tiene derecho a rechazar. Tu trabajo es conseguir que la app funcione sin permisos o con permisos parciales. Es un reto extra.
Modelo de ingresos para financiar el desarrollo
Aunque no puedo exagerar la importancia del software libre, libre de verdad, tampoco puedo ignorar que tengo una familia que mantener. Pero además, encontrar gente dispuesta a pagar por tu producto sirve como validación extra de tu idea. Sé abierto y honesto con tu modelo de ingresos y te ayudará a financiar tu propio proyecto; no dependas de inversores ni de capital riesgo, ¡financia tú mismo tu desarrollo!

No hace falta pagar para probar la app. La pantalla de pago solo aparece cuando de verdad usas la app (y siempre se puede cerrar). ¿Por qué no la pruebas tú mismo? Puedes encontrar la app aquí.
Futuro
Usar tu propio producto, dicen: seguiré desarrollando la app usándola yo mismo. No espero que este proyecto sea un éxito rápido (económico), pero si me resulta útil a mí, es probable que a otras personas también.

Una cosa que me gusta de este proyecto es que cuesta poco mantenerlo en marcha, porque me gusta entrenar. Depurar nuevas versiones de la app suele implicar salir a correr o a pedalear. ¡Quién dijo que programar era un trabajo sedentario!
Conclusión
Mucha gente tiene “grandes ideas”; pocas personas salen a hacerlas realidad. Eso distingue a los que hacen cosas del resto. A mí me gusta hacer cosas, porque el proceso te obliga a meterte de lleno en la materia. Aprendes un montón y ganas una experiencia que otros no tendrán. ¡Venga, constrúyelo tú mismo, hazlo tuyo!