Skip to content
··13 min de leitura

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 pronto. Ainda descobrindo o que dizer para minha filha."

Prometi um follow-up quando o app chegasse na App Store. Ou quando fosse rejeitado. Disse que a história da rejeição talvez fosse mais interessante.

DIALØGUE - AI Podcast Studio está agora no ar na App Store — um app iOS nativo em SwiftUI que transforma qualquer tema ou PDF em um episódio de podcast completamente produzido, construído com Claude Code por alguém que nunca tinha escrito Swift antes. Você pode baixar agora.

Mas não na primeira tentativa. Tenho que admitir — eu previa que a história da rejeição seria mais interessante do que a da aprovação. Eu estava certo.


O Que Aconteceu Quando a Apple Rejeitou a Primeira Submissão?

Minha primeira submissão foi rejeitada. Diretriz 2.1 — Desempenho: Completude do App. As compras no app estavam quebradas.

A mensagem de revisão da Apple foi educada — eles notaram que era minha primeira submissão, me parabenizaram por entrar no programa de desenvolvedores e explicaram o problema com clareza. Os produtos IAP retornavam um erro quando o revisor tentava fazer uma compra.

A questão é: o fluxo de compra funcionava perfeitamente nos meus testes. O problema estava no ambiente sandbox da Apple, que se comporta de forma 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 tinha testado com um arquivo de configuração StoreKit local enquanto o revisor estava acessando o sandbox real.

Corrigi no mesmo dia, resubmeti e passou. Depois enviei uma atualização de correção de bugs v1.0.1 logo em seguida, que também foi aprovada sem problemas.

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. Esse é o padrão, não é? Os fracassos são sempre mais instrutivos do que os sucessos.


Como São os "Últimos 40%" na Prática?

No post original, falei que a IA te leva 60% do caminho e os 40% restantes são inteiramente trabalho humano. Agora quero ser mais específico, porque tenho o git log para 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. São quase 4.000 linhas de "polimento".

Aqui está o que esses 16 commits continham de fato — aproximadamente na ordem em que aconteceram:

A Suite de Testes Que Deveria Ter Existido Desde o Primeiro Dia

O scaffold original tinha zero testes. Zero. O Claude construiu 69 arquivos de código de produção sem um único teste. Meu primeiro commit real após o post original adicionou 176 testes unitários e 19 testes de integração rodando contra uma instância local do Supabase.

Escrever esses testes revelou bugs de verdade imediatamente: falhas de decode do model Show por colunas inexistentes no banco de dados, AudioPlayer não resetando ao final da faixa, uma race condition no reload da biblioteca, um guard de UUID nulo faltando no wizard de criação. Cada um desses teria sido um crash em produção.

Acho que vale a pena nomear esse padrão: a IA gera código sem infraestrutura de testes. Não porque não consiga escrever testes — o Claude é ótimo nisso quando você pede — mas porque o prompt inicial de scaffold é sempre "crie o app", não "crie o app com testes abrangentes". Os testes vieram da minha decisão de que não me sentia confortável em publicar sem eles.

DIALØGUE iOS app outline review screen showing 6 podcast segments with Approve and Give Feedback buttons in dark mode
A etapa de revisão do outline — onde você aprova ou refina a pesquisa da IA antes de gerar o áudio.

Studio: A Funcionalidade Que Era Quase um Esboço

A funcionalidade "Studio" original para shows recorrentes era um placeholder. Dois commits depois, virou um 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 para garantir que tudo funcionasse de ponta a ponta.

É exatamente isso que eu quis dizer com "a IA construiu um codebase, não um produto". A funcionalidade Studio compilava. Renderizava uma tela. Mas você não conseguia gerenciar um podcast recorrente de verdade com ela.

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

O Player de Áudio Reimaginado

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 persistente acima da tab bar com progresso, controles de avanço e play/pause. Ao tocar nela, abre um sheet expandido de "Now Playing" com um 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 brigam entre si, criando uma bagunça tremida. É uma linha de estado que levou uma hora para diagnosticar.

Também adicionei downloads offline com UX sutil: um ícone verde nos episódios baixados na biblioteca, um toast de conclusão, um rótulo "Downloaded" no Now Playing e swipe para remover o 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 numa revisão de código.

Endurecimento de Segurança em Todas as Camadas

Esse foi impactante. Uma auditoria de segurança de toda a stack — não só do app iOS — revelou vulnerabilidades em múltiplas camadas: funções de banco de dados com permissões excessivas, edge cases de autenticação, lacunas na verificação de tokens e problemas de validação de input em vários serviços backend.

Nenhum desses estava no código Swift do iOS. Estavam no backend com o qual o app iOS se comunica. Mas publicar um app iOS significa que toda a sua stack agora está no bolso dos seus usuários. Isso elevou o grau de exigência para tudo. Código que "funcionava bem" para um app web de repente parecia inaceitável quando passava pelo processo de revisão da Apple e ia para um app nativo que as pessoas carregam consigo.

StoreKit: O Assassino da Submissão

O sandbox de testes do StoreKit é um universo próprio, e foi exatamente o que derrubou minha primeira submissão. O ambiente sandbox se comporta de forma diferente da produção. Transações às vezes ficam "pendentes" para sempre. O arquivo de configuração StoreKit do Xcode precisa de sincronização manual. Passei uma tarde inteira depurando um fluxo de compra que funcionava perfeitamente 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 encontrou um erro no sandbox porque minha configuração StoreKit estava fora de sincronia com o App Store Connect. O fluxo de compra funcionava bem nos meus testes locais — mas o revisor estava acessando o sandbox real, não meu arquivo de configuração StoreKit local. Corrigi no mesmo dia, mas é um exemplo perfeito de como a distância entre "funciona na minha máquina" e "funciona no ambiente da Apple" não é trivial.

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 para uma função server-side, que realiza verificação criptográfica completa da cadeia do recibo assinado da Apple. Não só decodificação — validação de assinatura de verdade. Isso levou dois commits dedicados para 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 pode preenchê-los por você. Declarações de App Tracking Transparency, rótulos de privacidade, conformidade de exportação para criptografia (sim, HTTPS conta), direitos de conteúdo, integração do captcha Turnstile. O Claude Code escreve Swift, mas não consegue 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 apenas 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 para inglês, espanhol, francês, japonês, coreano, vietnamita e chinês. O Claude fez as traduções e ficaram boas em sua maioria. Mas "boas em sua maioria" em japonês pode significar um rótulo de botão gramaticalmente correto que soa como foi escrito por um robô. Peguei vários assim mudando o idioma do celular e usando o app de verdade. Esse é o tipo de teste que a IA não consegue fazer por você — ainda não.


O Que Você Pode Fazer com o App iOS do DIALØGUE?

Para quem não leu a história original, aqui está o que o DIALØGUE faz:

Você fornece um tema — ou sobe um PDF — e ele produz um episódio de podcast completamente pesquisado, roteirizado e narrado. Dois apresentadores de IA têm uma conversa natural sobre o seu tema, com pesquisa real por trás. Nenhum microfone necessário.

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
  • Playback de áudio com controles na tela de bloqueio — reprodução em segundo plano funciona
  • Apple Sign-In, Google OAuth e auth por email
  • Compras no 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 frescos automaticamente
  • Upload de PDF — artigos de pesquisa, relatórios, livros como material-fonte

É um app SwiftUI nativo de verdade. Não é um wrapper web. Não é React Native. O que começou com 69 arquivos Swift agora tem 88 arquivos e 11.459 linhas de código, respaldadas por 195 testes. Estou genuinamente orgulhoso de ter publicado isso.

DIALØGUE iOS app library view showing podcast episodes with play buttons, duration, and dark mode UI
A biblioteca — seus episódios de podcast gerados, prontos para ouvir.

O Quanto Errei na Estimativa da "Fase de Polimento"?

Escrevi que o app estava "ainda em desenvolvimento, na fase de polimento final". Era tecnicamente verdade, mas subestimei o quanto da "fase de polimento" era trabalho novo de fato.

Olhando para o git log agora, 16 commits não soa como "polimento". Soa como uma segunda fase de desenvolvimento. A suite de testes sozinha — 176 testes unitários e 19 de integração — foi um projeto inteiro. O Studio foi de esboço a funcionalidade completa. O player de áudio foi reimaginado duas vezes. O endurecimento de segurança tocou mais de 40 funções no backend. O MFA foi reescrito do zero.

Também disse que tinha deletado o mini-player. Errei nisso também — acabei construindo um melhor, com um sheet de Now Playing, controles de velocidade e indicadores de download. O instinto original de "deletar" estava certo — o primeiro mini-player era ruim. Mas o conceito estava certo. Só precisava ser construído corretamente.

Acho que a divisão honesta, agora que consigo ver o quadro completo, é: a IA constrói a fundação (60%), os 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 União Europeia?

O DIALØGUE está disponível no mundo todo, mas a disponibilidade na UE ainda está sendo processada pela Apple. O Digital Markets Act da UE exige etapas adicionais de conformidade — divulgações de pagamentos alternativos, documentação específica de privacidade, detalhes de registro comercial. Enviei tudo, e a Apple está revisando agora. Deve ficar disponível nos países da UE em breve.

Se você está na UE e não pode esperar, o app web funciona em qualquer lugar e tem os mesmos recursos.


Qual é a Velocidade do Desenvolvimento iOS com IA?

O app iOS do DIALØGUE levou cerca de duas semanas do primeiro commit até a App Store — uma tarde de scaffold com IA e duas semanas de trabalho humano no produto. Continuo mantendo essa tabela porque ela continua me ensinando coisas:

ProjetoComplexidadeTempo para Construir
DIALØGUE v1MVP gerador de podcast~6 meses
STRAŦUM10 agentes de IA, 11 frameworks, multi-tenant75 dias
Redesign do siteReformulação do frontend WordPress3 dias
DIALØGUE v2Reconstrução completa do app web14 dias
Migração do blogWordPress → Next.js, 490 posts, Sydney RAG4 dias
DIALØGUE iOSApp iOS nativo, primeira vez usando Swift~2 semanas (scaffold: uma tarde)

A distância entre scaffold e publicação no DIALØGUE iOS foi de cerca de duas semanas. O scaffold em si levou uma tarde. Essa proporção — uma tarde de trabalho com IA, duas semanas de trabalho humano — diz tudo sobre onde estamos com o desenvolvimento assistido por IA agora.

A parte da IA continua ficando mais rápida. A parte humana permanece mais ou menos igual. Escrevi isso duas semanas atrás e ainda é verdade.


Que Habilidades Importam Quando a IA Escreve o Código?

No post original, ainda estava procurando o conselho certo. "Aprenda a ser a pessoa que abre o Simulator" era o melhor que eu tinha.

Agora que realmente publiquei o app, 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:

  1. Usei o produto. Não testei. Usei. Criei podcasts. Ouvi no caminho para o 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.

  2. Tomei decisões de julgamento que não têm respostas certas. 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? Essas 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 um instinto para o que parece certo.

  3. Naveguei por um sistema projetado para humanos. App Store Connect, declarações de privacidade, conformidade de exportação, requisitos de screenshots — nada disso pode ser automatizado. Requer leitura, compreensão de contexto e julgamento sobre implicações legais e de negócio. Essa habilidade — navegar por sistemas humanos complexos — não vai desaparecer.

Então talvez o conselho atualizado seja: aprenda a usar as coisas em profundidade, desenvolva gosto se importando com qualidade e fique confortável navegando por sistemas que não foram projetados para ser simples.

É mais concreto do que "aprenda a pensar criticamente". Acho que está mais perto da verdade. Ainda não tenho certeza se é suficiente.


Como Baixo o DIALØGUE?

O app é gratuito com compras de créditos no app. Sem assinatura.

Baixe na App Store

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. É gratuito para baixar com compras de créditos no 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 União Europeia?

Foi submetido e está sendo processado pela Apple. O Digital Markets Act da UE exige etapas adicionais de conformidade, e eu completei a papelada — só estou aguardando a revisão da Apple. Deve ficar disponível em breve. Enquanto isso, o app web funciona em qualquer lugar, incluindo na UE.

A Apple rejeitou?

Sim — a primeira submissão foi rejeitada por compras no app quebradas (Diretriz 2.1: Completude do App). A configuração do sandbox StoreKit não estava em sincronia com o App Store Connect, então as compras retornavam erro durante a revisão. Corrigi no mesmo dia, resubmeti e passou. Depois a v1.0.1 também passou. Três submissões no total, uma rejeição. A rejeição me ensinou mais do que as duas aprovações juntas.

Quanto tempo levou todo o processo?

Cerca de duas semanas do post original até a aprovação na App Store. O Claude Code estruturou 69 arquivos Swift em uma tarde. Os 16 commits restantes adicionaram 4.886 linhas em 57 arquivos — testes, funcionalidades do Studio, redesign do player de áudio, reescrita do MFA, endurecimento de segurança, verificação StoreKit, localização e o processo de submissão na App Store. O app foi publicado com 88 arquivos e 11.459 linhas, com 195 testes.

Qual foi a parte mais difícil dos últimos 40%?

Os testes de sandbox do StoreKit. A distância entre "isso funciona no código" e "isso funciona no sistema de transações da Apple" é enorme. Transações no sandbox se comportam de forma diferente da produção, os IDs de produto precisam coincidir exatamente (até espaços no final) e o ciclo de feedback é lento — você não pode simplesmente rodar um teste unitário.

Ainda posso usar o app web?

Claro. 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 central de geração de podcast é idêntica.


Ainda descobrindo o que dizer para minha filha. Mas pelo menos agora tenho um app publicado para mostrar quando digo que "o trabalho humano é a parte difícil".


Abraços, Chandler

Continuar Lendo

Minha Jornada
Conectar
Idioma
Preferências