Apps iOS en TestFlight + port de NeuroBirds web a iOS
7 min read

Mis primeras apps iOS están en TestFlight — y NeuroBirds se va al móvil

#iOS #SwiftUI #TestFlight #NeuroBirds #Desarrollo de juegos #App Store Connect

Después de meses de curva de aprendizaje intentando navegar el ecosistema de Apple con la cabeza de un desarrollador web, finalmente sucedió: mis primeras apps iOS están en distribución beta de TestFlight. Amigos las están probando ahora mismo. Y lo más destacado: mi juego de navegador NeuroBirds fue completamente porteado a iOS y está a punto de ser liberado.

Meses
Curva de aprendizaje Apple
TestFlight
Distribución beta activa
v2.5.0
NeuroBirds iOS Build 12
Pronto
Release público

La curva de aprendizaje que nadie menciona

Como desarrollador web pensé que iOS sería “solo otra plataforma”. SwiftUI es declarativo como React, Xcode es un IDE, y el concepto de distribución de apps lo conocía de npm.

Falso. El ecosistema de Apple es un planeta propio con su propia cultura, su propia burocracia y su propio idioma. Lo que aprendí en los últimos meses (a menudo a la mala):

Apple Developer Program

99 € al año, pago vía dirección fiscal alemana — vincular ID fiscal, DNI alemán y Apple ID puede tomar días, con llamadas de verificación desde EE.UU.

Contratos: Paid Apps Agreement

Antes de ofrecer cualquier cosa en TestFlight o en el Store, tienes que aceptar el "Paid Apps Agreement". Más W-8BEN para exención de retención fiscal estadounidense. Más DAC7 para participación en mercado UE. Tres contratos separados, cada uno con sus propios edge cases.

Signing & Certificates

Apple Development Certificate, Apple Distribution Certificate, Provisioning Profile por Bundle ID, App ID Registration — y si accidentalmente tuviste CODE_SIGN_STYLE en Manual una sola vez en la configuración Release, no puedes subir a TestFlight.

Bundle ID Registration

Un Bundle ID debe estar registrado en el Apple Developer Portal ANTES de aparecer en App Store Connect. Si no aparece en el dropdown: usualmente es un problema de contrato (Paid Apps faltante) o configuración de signing incorrecta.

Workflow de TestFlight

Build → Archive → Upload vía Xcode o altool → Apple procesa (5-30 min) → beta testers son invitados → instalan la app de TestFlight → instalan tu app → testean → mandan crash logs de vuelta. Por cada upload, CURRENT_PROJECT_VERSION debe incrementarse, si no Apple rechaza silenciosamente.

App Store Connect

Su propio backend web con su propia lógica. Cuestionario de Age Rating, declaración de App Privacy (privacidad obligatoria por categoría de dato), matriz de pricing para 175 mercados, screenshots en 6 tamaños de pantalla. Todo antes de poder hacer click en "Submit for Review".

NeuroBirds: del navegador a iOS

Mi juego NeuroBirds originalmente corría solo en navegador en neurobirds.com — un juego inspirado en Flappy Bird con un giro neuro (cada pájaro representa la actividad de una neurona, los puntajes cambian con la dinámica del juego).

Funcionaba bien en web. Pero la sensación de juego en una pantalla táctil es distinta a la del mouse, y el juego merece una experiencia nativa.

Así que lo porté completamente:

SwiftUI + SpriteKit

SwiftUI para menús, World Map, Settings, Onboarding. SpriteKit para la lógica del juego (física del pájaro, tubos, detección de colisión, animación de score, efectos de partículas en muerte).

Modos de juego

Classic (endless), Daily Challenge (seed nuevo cada día), Gauntlet (basado en niveles con tiers de dificultad), Zen (modo no-death), World Map (progresión de niveles temáticos). Cada modo tiene su propia escena SpriteKit.

Feedback háptico

Vibraciones del iPhone en tap, muerte, high score. Web no tenía acceso a haptics — en iOS de repente disponible y hace el juego masivamente mejor.

Integración GameKit

Leaderboards de Game Center (planeado para post-release), achievements, cloud save para progreso. La versión web tenía localStorage; iOS recibe iCloud sync.

Lo que más tiempo me llevó en el port

Las dificultades no obvias

  1. Pájaro fantasma entre modos

    Cambiar de Classic a Daily a Gauntlet a veces dejaba el pájaro como un "fantasma" pegado al borde de la pantalla. Root cause: las acciones de SpriteKit no se limpiaban entre cambios de escena. Fix: removeAllActions() + reset de scale en cada restartGame().

  2. World Map vs. startGame

    Una condición de protección con currentLevelId bloqueaba los niveles del World Map después de un cambio de modo. Regresión silenciosa — sin mensaje de error, solo "el tap no hace nada".

  3. Edge cases de LevelCompleteView

    Cuando un nivel se completaba, la view mostraba literalmente "level.complete.title" en lugar del string localizado, y el pájaro caía en lugar de celebrar. Race condition entre el estado completing y la detección de muerte.

  4. Hang Daily/Gauntlet

    On-device, el juego se colgaba esporádicamente al hacer tap en modo Daily/Gauntlet. Sin crash, solo congelado. Diagnóstico vía NSLog telemetry + simctl log show — finalmente un problema de estado en el handler de tap que solo se disparaba bajo race conditions específicas.

  5. Disciplina con build numbers

    Cada upload a TestFlight requiere incrementar CURRENT_PROJECT_VERSION. Lo olvidé doce veces en una sesión — cada bump olvidado = el servidor de Apple rechaza el upload silenciosamente, sin error en la UI de Xcode.

Status actual

NeuroBirds está actualmente en v2.5.0 Build 12 en distribución TestFlight interna. Amigos están testeando activamente, algunos bugs están en el backlog (sobre todo edge cases en la progresión del World Map), y el release público está planeado dentro de las próximas semanas — una vez que los últimos bugs estén arreglados y los screenshots para 6 tamaños de pantalla estén finales.

Si quieres testearlo

Si tienes iOS y quieres unirte al beta test, escríbeme una nota corta — con gusto extiendo la lista de TestFlight. Requisitos: app de TestFlight instalada, iOS 17+, feedback honesto sobre bugs / sugerencias de mejora.

Reflexión

Entrar al mundo iOS fue más frustrante de lo esperado, pero también más gratificante. Lo que se deploya a la web en una tarde toma semanas en iOS por burocracia, contratos, signing, reviews. Pero el producto final se siente “correcto” en otro nivel — touch nativo, haptics, push notifications, distribución App Store, discovery.

Para un studio web que se expande a hardware/móvil, la curva de aprendizaje iOS se paga una vez. Después de eso, tienes un segundo canal de distribución y una segunda superficie de producto que puedes poseer como marca Wender Media.

El equivalente Android sigue pendiente — siguiente curva de aprendizaje.


Enlaces: