A App Store Disse Sim
Duas semanas atrás escrevi "Ainda construindo. Ainda não pronto." Hoje o DIALØGUE está no ar na App Store. Veja como foram os últimos 40% na prática.
Duas semanas atrás terminei um post com: "Ainda construindo. Ainda não terminei. Ainda tentando descobrir o que dizer pra minha filha."
Prometi dar um update quando o app chegasse na App Store. Ou quando fosse rejeitado. Falei que a história da rejeição talvez fosse mais interessante.
DIALØGUE - AI Podcast Studio está no ar na App Store — um app iOS nativo em SwiftUI que transforma qualquer tema ou PDF num episódio de podcast totalmente produzido, construído com Claude Code por alguém que nunca tinha escrito Swift na vida. Pode baixar agora mesmo.
Mas não foi de primeira. Tenho que admitir — eu achava que a história da rejeição ia ser mais interessante que a da aprovação. Acertei.
O Que Aconteceu Quando a Apple Rejeitou?
Minha primeira submissão foi rejeitada. Diretriz 2.1 — Desempenho: Completude do App. As compras in-app estavam quebradas.
A mensagem da Apple foi educada — notaram que era minha primeira submissão, me parabenizaram por entrar no programa de desenvolvedores e explicaram o problema direitinho. Os produtos IAP davam erro quando o revisor tentava fazer uma compra.
O detalhe é que o fluxo de compra funcionava perfeito nos meus testes. O problema era o ambiente sandbox da Apple, que se comporta diferente tanto do desenvolvimento quanto da produção. A configuração do StoreKit precisava estar em sincronia exata com o App Store Connect — e a minha não estava. Eu vinha testando com um arquivo de configuração StoreKit local, enquanto o revisor acessava o sandbox real.
Corrigi no mesmo dia, reenviei e passou. Depois mandei um update v1.0.1 com correção de bug, que também passou tranquilo.
Três submissões no total. Uma rejeição. A rejeição me ensinou mais sobre o processo da App Store do que as duas aprovações juntas. É sempre assim, não é? Os fracassos ensinam mais que os acertos.
Como São os "Últimos 40%" de Verdade?
No post original, falei que a IA te leva 60% do caminho e os 40% restantes são inteiramente humanos. Agora quero ser mais específico, porque tenho o git log pra provar.
16 commits. 57 arquivos alterados. 4.886 linhas adicionadas. O app cresceu de 69 arquivos Swift para 88, de 7.568 linhas para 11.459. Quase 4.000 linhas de "polimento".
Veja o que esses 16 commits continham de fato — mais ou menos na ordem em que aconteceram:
Os Testes Que Deveriam Ter Existido Desde o Dia Um
O scaffold original tinha zero testes. Zero. O Claude criou 69 arquivos de código de produção e nenhum teste sequer. Meu primeiro commit de verdade depois do post original adicionou 176 testes unitários e 19 testes de integração rodando contra uma instância local do Supabase.
Escrever esses testes já pegou bugs reais na hora: falhas de decode do model Show por colunas que não existiam no banco, AudioPlayer que não resetava no fim da faixa, uma race condition no reload da biblioteca, um guard de UUID nulo faltando no wizard de criação. Cada um desses seria um crash em produção.
Acho que vale nomear esse padrão: IA gera código sem infraestrutura de testes. Não porque não saiba escrever testes — o Claude é ótimo nisso quando você pede — mas porque o prompt inicial é sempre "crie o app", não "crie o app com testes completos". Os testes vieram de mim, da decisão de que não me sentia confortável publicando sem eles.
Studio: A Feature Que Era Só um Rascunho
A feature "Studio" original pra shows recorrentes era um placeholder. Dois commits depois, virou produto de verdade: criação de shows com grids de templates, gerenciamento de episódios com badges de status e botões de ação, fluxos de edição/exclusão, configuração de agenda com seletores de fuso horário e sheets de personalização de voz.
Depois veio o Studio Fase 2: redesign do detalhe do show, retry/exclusão por episódio, geração manual de episódios com verificação de créditos. Mais 8 novos XCUITests pra garantir que tudo funcionasse de ponta a ponta.
É exatamente isso que eu quis dizer com "a IA construiu um codebase, não um produto". O Studio compilava. Renderizava uma tela. Mas você não conseguia de fato gerenciar um podcast recorrente com ele.
O Player de Áudio Repensado
Mencionei no post original que tinha deletado o mini-player. Acontece que eu estava errado — acabei construindo um melhor. O design final tem uma barra de mini-player fixa acima da tab bar com progresso, controles de avanço e play/pause. Toca nela e abre um sheet expandido de "Now Playing" com slider de posição, seletor de velocidade (0,5x a 2x), controles de transporte e uma animação de ondas sonoras na arte do episódio.
A parte complicada foi o estado isSeeking — sem ele, a posição do slider e o observer de áudio ficam brigando entre si, criando uma bagunça tremida. Uma linha de estado que levou uma hora pra diagnosticar.
Também adicionei downloads offline com UX sutil: ícone verde nos episódios baixados na biblioteca, toast de conclusão, rótulo "Downloaded" no Now Playing e swipe pra remover download. O DownloadManager tinha uma race condition de arquivo temporário no delegate do URLSession que causava falhas silenciosas — a correção foi mover o arquivo de forma síncrona dentro do callback. Não é o tipo de bug que aparece em code review.
Segurança: Reforço em Todas as Camadas
Essa parte foi de arrepiar. Uma auditoria de segurança da stack inteira — não só do app iOS — revelou vulnerabilidades em várias camadas: funções de banco de dados com permissões demais, edge cases de autenticação, brechas na verificação de tokens e problemas de validação de input em vários serviços backend.
Nenhum desses bugs estava no código Swift do iOS. Estavam no backend com o qual o app se comunica. Mas publicar um app iOS significa que toda a sua stack agora está no bolso dos seus usuários. Isso mudou o nível de exigência pra tudo. Código que "funcionava bem" num app web de repente parecia inaceitável passando pelo processo de revisão da Apple e indo parar num app nativo que as pessoas carregam no bolso.
StoreKit: O Vilão da Submissão
O sandbox de testes do StoreKit é um universo à parte, e foi exatamente o que matou minha primeira submissão. O ambiente sandbox se comporta diferente da produção. Transações às vezes ficam "pendentes" pra sempre. O arquivo de configuração StoreKit do Xcode precisa de sync manual. Passei uma noite inteira debugando um fluxo de compra que funcionava perfeito no código mas falhava silenciosamente no sandbox — descobri que os IDs de produto no App Store Connect tinham um espaço no final. Um espaço.
O revisor da Apple deu de cara com um erro no sandbox porque minha configuração StoreKit estava dessincronizada com o App Store Connect. O fluxo de compra funcionava nos meus testes locais — mas o revisor acessava o sandbox real, não meu arquivo de config local. Corrigi no mesmo dia, mas é o exemplo perfeito de como a distância entre "funciona na minha máquina" e "funciona no ambiente da Apple" é bem real.
A cadeia de verificação de compras foi um projeto à parte: o app iOS envia uma representação JWS (JSON Web Signature) da transação pra uma função server-side, que faz verificação criptográfica completa da cadeia do recibo assinado da Apple. Não é só decodificação — é validação de assinatura de verdade. Levou dois commits dedicados pra acertar.
Privacidade e Conformidade com a App Store
Privacidade e conformidade são formulários, decisões e checkboxes com implicações legais — e nenhuma IA preenche isso por você. Declarações de App Tracking Transparency, rótulos de privacidade, conformidade de exportação pra criptografia (sim, HTTPS conta), direitos de conteúdo, integração do captcha Turnstile. O Claude Code escreve Swift, mas não sabe te dizer se suas práticas de coleta de dados exigem um rótulo "Data Used to Track You".
MFA Completo e Localização
A implementação original de MFA era um esboço quebrado — IDs de fator vazios, fluxo só de verificação. Reescrevi como um ciclo de vida TOTP completo: enroll, scan de QR code (geração nativa com CoreImage), verificação, visualização de status, desativação. São 394 linhas de MFAView.swift que não existiam antes.
Localização em 7 idiomas significou 253 strings de interface traduzidas pra inglês, espanhol, francês, japonês, coreano, vietnamita e chinês. O Claude fez as traduções, e no geral ficaram boas. Mas "no geral boas" em japonês pode significar um botão gramaticalmente correto que soa como se um robô tivesse escrito. Peguei vários desses trocando o idioma do celular e usando o app de verdade. Esse é o tipo de teste que IA ainda não faz por você.
O Que Dá pra Fazer com o App iOS do DIALØGUE?
Pra quem não leu a história original, aqui vai o que o DIALØGUE faz:
Você dá um tema — ou manda um PDF — e ele produz um episódio de podcast totalmente pesquisado, roteirizado e narrado. Dois apresentadores de IA conversam naturalmente sobre o seu tema, com pesquisa real por trás. Sem microfone.
O app iOS inclui:
- Wizard de criação em 5 etapas — tema, formato, personalização, revisão do outline, revisão do script
- 30 vozes de IA em 7 idiomas — inglês, espanhol, francês, japonês, coreano, vietnamita, chinês
- 9 formatos de podcast — de Tech News Analysis até Investigative Comedy
- Áudio com controles na tela de bloqueio — reprodução em segundo plano funciona direitinho
- Apple Sign-In, Google OAuth e auth por email
- Compras in-app — baseado em créditos, sem assinatura: 4 créditos por US$4,99, 9 por US$9,99, 18 por US$19,99
- Studio — configure shows recorrentes que geram episódios novos automaticamente
- Upload de PDF — artigos de pesquisa, relatórios, livros como material-fonte
É um app SwiftUI nativo de verdade. Não é wrapper web. Não é React Native. O que começou com 69 arquivos Swift agora são 88 arquivos e 11.459 linhas de código, com 195 testes. Tenho orgulho de verdade de ter colocado isso no ar.
O Quanto Eu Errei na Estimativa de "Polimento"?
Escrevi que o app estava "ainda em desenvolvimento, na fase de polimento final". Tecnicamente verdade, mas subestimei o quanto dessa "fase de polimento" era trabalho novo.
Olhando pro git log agora, 16 commits não soa como "polimento". Soa como uma segunda fase de desenvolvimento. Só a suite de testes — 176 testes unitários e 19 de integração — já foi um projeto inteiro. O Studio saiu de rascunho pra feature completa. O player de áudio foi repensado duas vezes. O reforço de segurança mexeu em mais de 40 funções no backend. O MFA foi reescrito do zero.
Também falei que tinha deletado o mini-player. Errei nisso também — acabei construindo um melhor, com sheet de Now Playing, controles de velocidade e indicadores de download. O instinto de "deletar" estava certo — o primeiro mini-player era ruim. Mas o conceito estava certo. Só precisava ser feito direito.
Acho que a divisão honesta, agora que vejo o quadro completo, é: a IA constrói a fundação (60%), humanos constroem o produto (30%), e o processo de submissão na App Store te ensina os 10% restantes.
O DIALØGUE Está Disponível na UE?
O DIALØGUE está disponível no mundo todo, mas a UE ainda está sendo processada pela Apple. O Digital Markets Act exige etapas extras de conformidade — divulgações de pagamentos alternativos, documentação de privacidade, dados de registro comercial. Enviei tudo, e a Apple está revisando. Deve ficar disponível nos países da UE em breve.
Se você está na UE e não quer esperar, o app web funciona em qualquer lugar e tem os mesmos recursos.
Quão Rápido É Desenvolver pra iOS com IA?
O app iOS do DIALØGUE levou umas duas semanas do primeiro commit até a App Store — uma noite de scaffold com IA e duas semanas de trabalho humano no produto. Mantenho essa tabela porque ela sempre me ensina algo:
| Projeto | Complexidade | Tempo para Construir |
|---|---|---|
| DIALØGUE v1 | MVP gerador de podcast | ~6 meses |
| STRAŦUM | 10 agentes de IA, 11 frameworks, multi-tenant | 75 dias |
| Redesign do site | Reformulação do frontend WordPress | 3 dias |
| DIALØGUE v2 | Reconstrução completa do app web | 14 dias |
| Migração do blog | WordPress → Next.js, 490 posts, Sydney RAG | 4 dias |
| DIALØGUE iOS | App iOS nativo, primeira vez usando Swift | ~2 semanas (scaffold: uma noite) |
A distância entre scaffold e publicação do DIALØGUE iOS foi umas duas semanas. O scaffold em si levou uma noite. Essa proporção — uma noite de IA, duas semanas de trabalho humano — diz tudo sobre onde estamos com desenvolvimento assistido por IA agora.
A parte da IA fica cada vez mais rápida. A parte humana continua mais ou menos igual. Escrevi isso duas semanas atrás e continua valendo.
Que Habilidades Importam Quando a IA Escreve o Código?
No post original, ainda estava buscando o conselho certo. "Aprenda a ser a pessoa que abre o Simulator" era o melhor que eu tinha.
Agora que de fato publiquei o negócio, acho que consigo ser um pouco mais específico.
O app existe por causa de três coisas que a IA não conseguia fazer:
-
Usei o produto. Não testei. Usei. Criei podcasts. Ouvi no caminho pro trabalho. Percebi que a tela de revisão do outline precisava mostrar as fontes de pesquisa porque eu queria saber de onde vinham os fatos.
-
Tomei decisões que não têm resposta certa. Deletar o mini-player ou manter? Quanta personalização é demais num wizard de criação? O Studio deveria ser uma aba ou uma seção? Não são decisões de engenharia. São decisões de gosto. E gosto vem de usar muitos produtos — os ótimos e os horríveis — e desenvolver instinto pro que parece certo.
-
Naveguei um sistema feito pra humanos. App Store Connect, declarações de privacidade, conformidade de exportação, requisitos de screenshots — nada disso se automatiza. Exige leitura, compreensão de contexto e julgamento sobre implicações legais e de negócio. Essa habilidade — navegar sistemas humanos complexos — não vai embora.
Então talvez o conselho atualizado seja: aprenda a usar as coisas a fundo, desenvolva gosto se importando com qualidade, e fique confortável navegando sistemas que não foram feitos pra ser simples.
Mais concreto do que "aprenda a pensar criticamente". Acho que está mais perto da verdade. Ainda não sei se é suficiente.
Como Baixar o DIALØGUE?
O app é gratuito com compras de créditos in-app. Sem assinatura.
Disponível no mundo todo — a disponibilidade na UE está sendo processada pela Apple e deve ficar ativa em breve. O app web está disponível em qualquer lugar.
Perguntas Frequentes
O DIALØGUE está disponível na App Store?
Sim! O DIALØGUE - AI Podcast Studio está no ar na App Store desde março de 2026. Download gratuito com compras de créditos in-app (4 créditos por US$4,99, 9 por US$9,99, 18 por US$19,99). Disponível no mundo todo — a disponibilidade na UE foi submetida e está sendo processada pela Apple.
Está disponível na UE?
Foi submetido e está sendo processado pela Apple. O Digital Markets Act exige etapas extras de conformidade, e eu já fiz toda a papelada — só aguardando a revisão da Apple. Deve ficar disponível em breve. Enquanto isso, o app web funciona em qualquer lugar, inclusive na UE.
A Apple rejeitou?
Sim — a primeira submissão foi rejeitada por compras in-app quebradas (Diretriz 2.1: Completude do App). A configuração do sandbox StoreKit estava dessincronizada com o App Store Connect, e as compras davam erro durante a revisão. Corrigi no mesmo dia, reenviei e passou. A v1.0.1 também passou. Três submissões no total, uma rejeição. A rejeição me ensinou mais que as duas aprovações juntas.
Quanto tempo levou todo o processo?
Umas duas semanas do post original até a aprovação na App Store. O Claude Code montou 69 arquivos Swift numa noite. Os 16 commits seguintes adicionaram 4.886 linhas em 57 arquivos — testes, features do Studio, redesign do player, reescrita do MFA, reforço de segurança, verificação StoreKit, localização e o processo de submissão. O app saiu com 88 arquivos, 11.459 linhas e 195 testes.
Qual foi a parte mais difícil dos últimos 40%?
Sandbox do StoreKit, sem dúvida. A distância entre "funciona no código" e "funciona no sistema de transações da Apple" é gigante. Transações no sandbox se comportam diferente da produção, os IDs de produto precisam bater exatamente (até espaços no final contam) e o ciclo de feedback é lento — não dá pra simplesmente rodar um teste unitário.
Ainda posso usar o app web?
Com certeza. O podcast.chandlernguyen.com tem os mesmos recursos e funciona em qualquer dispositivo. O app iOS adiciona conveniências nativas — Apple Sign-In, controles na tela de bloqueio, downloads offline — mas a experiência de gerar podcasts é a mesma.
Ainda tentando descobrir o que dizer pra minha filha. Mas pelo menos agora tenho um app publicado pra apontar quando digo que "o trabalho humano é a parte difícil".
Abraços, Chandler








