Skip to content
··14 min de lectura

La App Store dijo que sí

Hace dos semanas escribí "Todavía construyendo. Todavía sin terminar." Hoy DIALØGUE está en vivo en la App Store. Esto es lo que ese último 40% realmente implicó.

Hace dos semanas terminé un post con esto: "Todavía construyendo. Todavía sin terminar. Todavía descubriendo qué decirle a mi hija."

Prometí una actualización cuando la app llegara a la App Store. O cuando la rechazaran. Dije que la historia del rechazo podría ser más interesante.

DIALØGUE - AI Podcast Studio ya está en vivo en la App Store — una app iOS nativa con SwiftUI que convierte cualquier tema o PDF en un episodio de podcast completamente producido, construida con Claude Code por alguien que nunca había escrito una línea de Swift. Puedes descargarla ahora mismo.

Pero no al primer intento. Tengo que admitir que predije que la historia del rechazo podría ser más interesante que la de la aprobación. Tenía razón.


¿Qué pasó cuando Apple rechazó la primera entrega?

Mi primera entrega fue rechazada. Directriz 2.1 — Rendimiento: Completitud de la app. Las compras dentro de la app estaban rotas.

El mensaje de revisión de Apple fue amable — notaron que era mi primera entrega, me felicitaron por unirme al programa de desarrolladores y explicaron el problema con claridad. Los productos de compra dentro de la app arrojaban un error cuando su revisor intentaba hacer una compra.

El punto es este: el flujo de compra funcionaba perfectamente en mis pruebas. El problema estaba en el entorno sandbox de Apple, que se comporta de manera diferente tanto al desarrollo como a producción. La configuración de StoreKit tenía que estar exactamente sincronizada con App Store Connect — y la mía no lo estaba. Estaba probando contra un archivo de configuración local de StoreKit mientras que el revisor usaba el sandbox real.

Lo arreglé ese mismo día, volví a enviarlo y pasó. Luego publiqué una actualización de corrección de errores v1.0.1 poco después, que también salió sin problemas.

Tres entregas en total. Un rechazo. El rechazo me enseñó más sobre el proceso de la App Store que cualquiera de las dos aprobaciones. ¿Ese es el patrón, verdad? Los fracasos siempre son más educativos que los éxitos.


¿Cómo luce realmente ese "último 40%"?

En el post original, dije que la IA te lleva al 60% del camino y que el 40% restante es enteramente trabajo humano. Quiero ser más específico ahora, porque tengo el git log para probarlo.

16 commits. 57 archivos modificados. 4.886 líneas agregadas. La app creció de 69 archivos Swift a 88, de 7.568 líneas a 11.459. Casi 4.000 líneas de "pulido".

Esto es lo que esos 16 commits contenían en realidad — más o menos en el orden en que ocurrieron:

La suite de pruebas que debió haber existido desde el primer día

El andamio original tenía cero pruebas. Ninguna. Claude construyó 69 archivos de código de producción y ni una sola prueba. Mi primer commit real después del post original agregó 176 pruebas unitarias y 19 pruebas de integración ejecutándose contra una instancia local de Supabase.

Escribir esas pruebas detectó bugs reales de inmediato: errores de decodificación del modelo Show desde columnas inexistentes en la base de datos, AudioPlayer que no se reiniciaba al final de la pista, una condición de carrera en la recarga de la biblioteca, un guard de UUID nulo que faltaba en el asistente de creación. Cada uno de estos habría sido un crash en producción.

Creo que este es un patrón que vale la pena nombrar: la IA genera código sin infraestructura de pruebas. No porque no pueda escribir pruebas — Claude es excelente escribiendo pruebas cuando se lo pedís — sino porque el prompt inicial de andamiaje siempre es "construye la app", no "construye la app con pruebas exhaustivas". Las pruebas vinieron de mi decisión de no estar cómodo publicando sin ellas.

DIALØGUE iOS app outline review screen showing 6 podcast segments with Approve and Give Feedback buttons in dark mode
El paso de revisión del esquema — donde aprobás o refinás la investigación de la IA antes de que genere el audio.

Studio: la funcionalidad que era apenas un esqueleto

La funcionalidad "Studio" original para programas recurrentes era un placeholder. Dos commits después, era un producto real: creación de programas con grillas de plantillas, gestión de episodios con insignias de estado y botones de acción, flujos de edición y eliminación, configuración de calendario con selectores de zona horaria y hojas de personalización de voz.

Luego vino Studio Fase 2: rediseño del detalle del programa, reintento y eliminación por episodio, generación manual de episodios con verificación de créditos. Más 8 nuevos XCUITests para asegurarse de que todo funcionara de punta a punta.

Esto es lo que quise decir con "la IA construyó una base de código, no un producto". La funcionalidad Studio compilaba. Renderizaba una pantalla. Pero no se podía gestionar realmente un programa de podcast recurrente con ella.

DIALØGUE iOS app showing 9 podcast format templates including Tech News Analysis, Deep Dive, and Investigative Comedy in a dark-mode grid layout
Nueve formatos de podcast — desde Tech News Analysis hasta Investigative Comedy.

El reproductor de audio reimaginado

En el post original mencioné que había eliminado el mini reproductor. Resulta que estaba equivocado — terminé construyendo uno mejor. El diseño final tiene una barra persistente de mini reproductor sobre la barra de pestañas con progreso, controles de salto y reproducción/pausa. Tocás la barra y aparece una hoja expandida "Now Playing" con un slider de búsqueda, selector de velocidad (0.5x a 2x), controles de transporte y una animación de anillos de sonido.

La parte complicada fue el estado isSeeking — sin él, la posición del slider y el observador de audio pelean entre sí, creando un desastre entrecortado. Es una línea de estado que tardó una hora en diagnosticar.

También agregué descargas offline con UX ambiental: un ícono verde en los episodios descargados en la biblioteca, un toast de finalización, una etiqueta "Descargado" en Now Playing y deslizar para eliminar la descarga. El DownloadManager tenía una condición de carrera de archivo temporal en el delegate de URLSession que causaba fallas silenciosas — la solución fue un movimiento de archivo sincrónico dentro del callback. No es el tipo de bug que aparece en una revisión de código.

Endurecimiento de seguridad en todas las capas

Esta parte fue sobria. Una auditoría de seguridad del stack completo — no solo la app iOS — reveló vulnerabilidades en múltiples capas: funciones de base de datos con permisos excesivos, casos límite de autenticación, brechas en la verificación de tokens y problemas de validación de entrada en varios servicios del backend.

Ninguno de estos estaba en el código Swift de iOS. Estaban en el backend con el que habla la app iOS. Pero publicar una app iOS significa que todo tu stack ahora está en el bolsillo de tus usuarios. Eso elevó las apuestas en todo. Código que "funcionaba bien" para una app web de repente se sentía inaceptable cuando pasaba por el proceso de revisión de Apple y entraba en una app nativa que la gente lleva consigo.

StoreKit: el asesino de entregas

Las pruebas en el sandbox de StoreKit son un universo propio, y fue exactamente lo que provocó el rechazo de mi primera entrega. El entorno sandbox se comporta diferente a producción. Las transacciones a veces quedan "pendientes" para siempre. El archivo de configuración de StoreKit en Xcode requiere sincronización manual. Pasé una tarde entera depurando un flujo de compra que funcionaba perfectamente en el código pero fallaba silenciosamente en el sandbox — resultó que los IDs de producto en App Store Connect tenían un espacio al final. Un espacio.

El revisor de Apple encontró un error de sandbox porque mi configuración de StoreKit estaba fuera de sincronía con App Store Connect. El flujo de compra funcionaba bien en mis pruebas locales — pero el revisor estaba usando el sandbox real, no mi archivo de configuración local de StoreKit. Lo arreglé ese mismo día, pero es un ejemplo perfecto de cómo la brecha entre "funciona en mi máquina" y "funciona en el entorno de Apple" no es trivial.

La cadena de verificación de compras fue un proyecto en sí misma: la app iOS envía una representación JWS (JSON Web Signature) de la transacción a una función del lado del servidor, que realiza verificación criptográfica completa de la cadena del recibo firmado de Apple. No solo decodificación — validación real de firma. Esto tomó dos commits dedicados para hacerlo bien.

Privacidad y cumplimiento de la App Store

La privacidad y el cumplimiento son formularios, decisiones y casillas de verificación con implicaciones legales — y ninguna IA puede completarlos por vos. Declaraciones de App Tracking Transparency, etiquetas nutricionales de privacidad, cumplimiento de exportación para cifrado (sí, HTTPS cuenta), derechos de contenido, integración de Turnstile captcha. Claude Code puede escribir Swift, pero no puede decirte si tus prácticas de recopilación de datos requieren una etiqueta de "Datos usados para rastrearte".

MFA completo y localización

La implementación original de MFA era un esqueleto roto — IDs de factores vacíos, solo flujo de verificación. La reescribí como un ciclo completo de TOTP: enrolamiento, escaneo de código QR (generación nativa con CoreImage), verificación, visualización del estado, desactivación. Eso es un MFAView.swift de 394 líneas que no existía antes.

La localización en 7 idiomas significó 253 cadenas de interfaz traducidas al inglés, español, francés, japonés, coreano, vietnamita y chino. Claude hizo las traducciones, y en su mayoría estaban bien. Pero "en su mayoría bien" en japonés significa que podrías tener una etiqueta de botón que es gramaticalmente correcta pero suena como si la escribiera un robot. Detecté varios de esos casos cambiando el idioma de mi teléfono y usando la app de verdad. Ese es el tipo de prueba que la IA no puede hacer por vos — todavía no.


¿Qué podés hacer con la app iOS de DIALØGUE?

Para quienes no leyeron la historia original de construcción, esto es lo que hace DIALØGUE:

Le das un tema — o subís un PDF — y produce un episodio de podcast completamente investigado, guionado y narrado. Dos anfitriones de IA tienen una conversación natural sobre tu tema, respaldados por investigación real. Sin micrófono.

La app iOS incluye:

  • Asistente de creación en 5 pasos — tema, formato, personalización, revisión del esquema, revisión del guion
  • 30 voces de IA en 7 idiomas — inglés, español, francés, japonés, coreano, vietnamita, chino
  • 9 formatos de podcast — desde Tech News Analysis hasta Investigative Comedy
  • Reproducción de audio con controles en la pantalla de bloqueo — reproducción en segundo plano que funciona
  • Apple Sign-In, Google OAuth y autenticación por correo
  • Compras dentro de la app — basadas en créditos, sin suscripción: 4 créditos por $4.99, 9 por $9.99, 18 por $19.99
  • Studio — configurá programas recurrentes que generan episodios frescos automáticamente
  • Carga de PDF — artículos de investigación, informes, libros como material de origen

Es una app SwiftUI nativa de verdad. No un wrapper web. No React Native. Lo que empezó con 69 archivos Swift ahora son 88 archivos y 11.459 líneas de código, respaldadas por 195 pruebas. Estoy genuinamente orgulloso de haberla publicado.

DIALØGUE iOS app library view showing podcast episodes with play buttons, duration, and dark mode UI
La biblioteca — tus episodios de podcast generados, listos para reproducir.

¿Qué tan equivocado estaba con mi estimación original de la "fase de pulido"?

Escribí que la app estaba "todavía en desarrollo, en la fase final de pulido". Eso era técnicamente cierto, pero subestimé cuánto de la "fase de pulido" era en realidad trabajo nuevo.

Mirando el git log ahora, 16 commits no suena a "pulido". Suena a una segunda fase de desarrollo. La suite de pruebas sola — 176 pruebas unitarias y 19 pruebas de integración — fue todo un proyecto. Studio pasó de ser un esqueleto a una funcionalidad completa. El reproductor de audio fue reimaginado dos veces. El endurecimiento de seguridad tocó más de 40 funciones del backend. MFA fue reescrito desde cero.

También dije que había eliminado el mini reproductor. También estaba equivocado en eso — terminé construyendo uno mejor, con una hoja Now Playing, controles de velocidad e indicadores de descarga. El instinto original de "eliminarlo" era correcto — el primer mini reproductor era malo. Pero el concepto era correcto. Solo había que construirlo bien.

Creo que la división honesta, ahora que puedo ver el panorama completo, es: la IA construye los cimientos (60%), los humanos construyen el producto (30%), y el proceso de entrega a la App Store te enseña el 10% restante.


¿Está disponible DIALØGUE en la UE?

DIALØGUE está disponible en todo el mundo, pero la disponibilidad en la UE todavía está siendo procesada por Apple. La Ley de Mercados Digitales de la UE requiere pasos adicionales de cumplimiento — divulgaciones de pagos alternativos, documentación específica de privacidad, detalles de registro comercial. Envié todo, y Apple lo está revisando ahora. Debería estar disponible en los países de la UE pronto.

Si estás en la UE y no podés esperar, la app web funciona en todas partes y tiene las mismas funcionalidades.


¿Qué tan rápido es el desarrollo de iOS asistido por IA?

La app iOS de DIALØGUE tardó aproximadamente dos semanas desde el primer commit hasta la App Store — una noche de andamiaje con IA y dos semanas de trabajo humano en el producto. Sigo manteniendo esta tabla porque sigue enseñándome cosas:

ProyectoComplejidadTiempo de construcción
DIALØGUE v1MVP generador de podcasts~6 meses
STRAŦUM10 agentes de IA, 11 frameworks, multi-tenant75 días
Rediseño del sitioRenovación del frontend de WordPress3 días
DIALØGUE v2Reconstrucción completa de la app web14 días
Migración del blogWordPress → Next.js, 490 posts, Sydney RAG4 días
DIALØGUE iOSApp iOS nativa, primera vez usando Swift~2 semanas (andamio: una noche)

La brecha entre el andamio y la publicación de DIALØGUE iOS fue de unas dos semanas. El andamio en sí fue una noche. Esa proporción — una noche de trabajo con IA, dos semanas de trabajo humano — te dice todo sobre dónde estamos con el desarrollo asistido por IA ahora mismo.

La parte de la IA sigue acelerándose. La parte humana se mantiene más o menos igual. Lo escribí hace dos semanas y sigue siendo verdad.


¿Qué habilidades importan cuando la IA construye el código?

En el post original, todavía estaba buscando el consejo correcto. "Aprende a ser la persona que abre el Simulador" era lo mejor que tenía.

Ahora que en realidad publiqué la cosa, creo que puedo ser un poco más específico.

La app existe gracias a tres cosas que la IA no pudo hacer:

  1. Usé el producto. No lo probé. Lo usé. Creé podcasts. Los escuché en el camino al trabajo. Noté que la pantalla de revisión del esquema necesitaba mostrar las fuentes de investigación porque quería saber de dónde venían los datos.

  2. Tomé decisiones de juicio que no tienen una respuesta correcta. ¿Eliminar el mini reproductor o conservarlo? ¿Cuánta personalización es demasiada en un asistente de creación? ¿Debería Studio ser una pestaña o una sección? Estas no son decisiones de ingeniería. Son decisiones de gusto. Y el gusto viene de usar muchos productos — excelentes y terribles — y desarrollar un instinto para lo que se siente bien.

  3. Navegué un sistema diseñado para humanos. App Store Connect, declaraciones de privacidad, cumplimiento de exportación, requisitos de capturas de pantalla — nada de esto se puede automatizar. Requiere leer, entender el contexto y tomar decisiones sobre implicaciones legales y comerciales. Esa habilidad — navegar sistemas humanos complejos — no va a desaparecer.

Así que quizás el consejo actualizado es: aprende a usar las cosas en profundidad, desarrollá gusto al importarte la calidad, y sentite cómodo navegando sistemas que no fueron diseñados para ser simples.

Eso es más concreto que "aprende a pensar críticamente". Creo que está más cerca de la verdad. Todavía no estoy seguro de que sea suficiente.


¿Cómo descargo DIALØGUE?

La app es gratuita con compras de créditos dentro de la app. Sin suscripción.

Descargar en la App Store

Disponible en todo el mundo — la disponibilidad en la UE está siendo procesada por Apple y debería estar en vivo pronto. La app web está disponible en todas partes.


Preguntas frecuentes

¿Está DIALØGUE disponible en la App Store?

¡Sí! DIALØGUE - AI Podcast Studio está en vivo en la App Store desde marzo de 2026. Es una descarga gratuita con compras de créditos dentro de la app (4 créditos por $4.99, 9 por $9.99, 18 por $19.99). Disponible en todo el mundo — la disponibilidad en la UE fue enviada y está siendo procesada por Apple.

¿Está disponible en la UE?

Fue enviada y está siendo procesada por Apple. La Ley de Mercados Digitales de la UE requiere pasos adicionales de cumplimiento, y completé el papeleo — solo esperando la revisión de Apple. Debería estar disponible pronto. Mientras tanto, la app web funciona en todas partes, incluyendo la UE.

¿Apple la rechazó?

Sí — la primera entrega fue rechazada por compras dentro de la app rotas (Directriz 2.1: Completitud de la app). La configuración de sandbox de StoreKit no estaba sincronizada con App Store Connect, así que las compras arrojaban un error durante la revisión. Lo arreglé ese mismo día, volví a enviarla y pasó. Luego v1.0.1 también pasó. Tres entregas en total, un rechazo. El rechazo me enseñó más que cualquiera de las aprobaciones.

¿Cuánto tiempo tomó todo el proceso?

Aproximadamente dos semanas desde el post original hasta la aprobación de la App Store. Claude Code construyó el andamio de 69 archivos Swift en una noche. Los 16 commits restantes agregaron 4.886 líneas en 57 archivos — pruebas, funcionalidades de Studio, rediseño del reproductor de audio, reescritura de MFA, endurecimiento de seguridad, verificación de StoreKit, localización y el proceso de entrega a la App Store. La app se publicó con 88 archivos y 11.459 líneas con 195 pruebas.

¿Cuál fue la parte más difícil del último 40%?

Las pruebas en el sandbox de StoreKit. La brecha entre "esto funciona en el código" y "esto funciona en el sistema de transacciones de Apple" es enorme. Las transacciones en el sandbox se comportan diferente a producción, los IDs de producto tienen que coincidir exactamente (hasta los espacios al final), y el ciclo de retroalimentación es lento — no podés simplemente ejecutar una prueba unitaria.

¿Todavía puedo usar la app web?

Por supuesto. podcast.chandlernguyen.com tiene las mismas funcionalidades y funciona en cualquier dispositivo. La app iOS agrega comodidades nativas — Apple Sign-In, controles en la pantalla de bloqueo, descargas offline — pero la experiencia central de generación de podcasts es idéntica.


Todavía descubriendo qué decirle a mi hija. Pero al menos ahora tengo una app publicada para señalar cuando digo "el trabajo humano es la parte difícil."


Un abrazo, Chandler

Seguir leyendo

Mi Trayectoria
Conectar
Idioma
Preferencias