Bastidores

Desenvolvimento· Construindo o Garfim · parte 16

Como forçar atualização no React Native antes de um defeito grave.

Como o Garfim usa uma versão mínima para pedir atualização pela loja e evita bloqueios quando falta conexão ou versão conhecida.

Celular com a tela pedindo atualização e o link para a loja.

Em 30 de outubro de 2026, durante uma triagem de monitoramento de erros do Garfim, encontrei um padrão que se repetia: defeitos em versões antigas continuavam em uso por semanas.

Quando um aplicativo é publicado no Google Play ou na App Store e não tem atualização pelo ar, uma versão lançada não pode ser retirada das lojas. Sem um mecanismo próprio para forçar a atualização, cada alteração futura no servidor é obrigada a manter compatibilidade com todas as versões já distribuídas.

Para resolver esse problema de raiz, criei um portão de versão mínima suportada. A principal lição dessa arquitetura é simples: a trava precisa ser desenvolvida e publicada antes que um defeito grave aconteça.

Uma versão publicada na loja nunca deixa de existir

As lojas oficiais de aplicativos não oferecem um botão de reversão instantânea. Se você publica uma versão com um bug sutil de sincronização ou uma incompatibilidade de banco de dados, quem instalou essa versão continuará com ela aberta até decidir atualizar por conta própria.

Sem atualizações pelo ar no projeto, a única forma de fazer o código novo chegar ao aparelho é pela loja. Se o aplicativo não possui uma rotina nativa para verificar se ainda tem autorização para operar, ele pode continuar chamando a API até a pessoa atualizar. Na prática, o desenvolvedor vira refém das próprias decisões passadas.

A consequência no servidor é pesada. Sem uma forma de aposentar versões, cada mudança da API precisa considerar as versões já distribuídas.

A API publica a versão mínima e o app bloqueia a navegação

A solução adotada no Garfim funciona em duas pontas coordenadas. No servidor, a API publica variáveis de ambiente que definem a menor compilação aceita para cada sistema operacional: uma para iOS e outra para Android.

No aplicativo em React Native, o número da compilação instalada é lido diretamente do sistema nativo. A comparação utiliza os identificadores numéricos que crescem a cada geração do build, evitando ambiguidades entre nomes comerciais de versão. Essa consulta à API é pública, permitindo que a checagem ocorra logo na inicialização, antes mesmo do login do usuário ou do preenchimento de cadastros iniciais.

Quando o aplicativo detecta que a compilação atual está abaixo do limite mínimo publicado, o layout raiz entra em ação. Ele intercepta a navegação e substitui todas as rotas internas por uma tela única e intransponível de aviso. Nessa tela, uma mensagem objetiva explica a necessidade de atualizar e exibe um link direto para a respectiva loja de aplicativos.

O suporte a falhas e modo offline impede bloqueios acidentais

Um portão de atualização mal planejado pode criar um problema pior do que o bug que pretende evitar. Se a verificação depender estritamente de uma resposta rápida da rede a cada clique, qualquer oscilação de sinal impedirá o usuário de abrir o aplicativo.

Para contornar essa fragilidade, o Garfim adota regras estritas de resiliência:

  • Se a resposta da API trouxer versão desconhecida ou a variável estiver vazia, o app nunca bloqueia.
  • A verificação não atrasa as telas, permitindo abrir a interface sem esperar a rede.
  • A última resposta válida fica salva localmente. Uma compilação já bloqueada continua barrada se abrir sem internet.
  • A cada abertura e retorno ao primeiro plano com conexão ativa, uma nova checagem é feita. Reduzir o mínimo libera o app na hora.

Hoje, nenhuma versão está bloqueada no ambiente de produção. O portão está armado e pronto para agir apenas se uma emergência real exigir a retirada de uma compilação do ar.

A trava só pode ser exigida depois da distribuição total na loja

Subir o número da versão mínima no servidor é uma decisão operacional delicada, pois pode bloquear o acesso de quem ainda usa uma versão abaixo do mínimo. Por essa razão, essa alteração não é feita por cliques improvisados em painéis: ela passa por revisão de código e é publicada por meio de esteira de integração contínua.

Existe uma regra de ouro para elevar esse patamar: a versão substituta precisa estar cem por cento disponível para todos os usuários na loja correspondente. Se o Google Play estiver executando um lançamento gradual, ou se a versão da App Store ainda não tiver sido liberada, subir o mínimo na API deixará pessoas barradas diante de uma loja que ainda não oferece o botão de atualizar.

Na Apple, a liberação gradual distribui as atualizações automáticas; uma versão já lançada fica disponível para atualização manual. O portão de versão mínima só deve alcançar compilações que já tenham uma alternativa pública e acessível para a base inteira.

O portão de versão precisa nascer antes do primeiro incidente

A maior armadilha desse mecanismo é a ilusão de que ele pode ser construído quando o problema aparecer. O portão só protege as versões que já trazem o código da checagem compilado dentro de si.

Se uma compilação antiga não foi programada para consultar a API e substituir a navegação, nenhuma instrução remota fará aquela tela de bloqueio surgir. O servidor até poderia recusar as requisições com erros genéricos, mas a pessoa no celular veria apenas mensagens confusas de falha de conexão, sem entender que precisa abrir a loja e baixar a atualização.

Por isso a trava entrou na versão 0.1.2 do Garfim, enviada às duas lojas em 31 de outubro de 2026. As compilações anteriores ainda dependem de cuidados no servidor, mas as versões que incluem a trava obedecem à regra. Criar a trava antes do defeito dá tranquilidade para evoluir o sistema. Para ver os passos anteriores da preparação do aplicativo, confira o relato sobre conseguir testadores e esperar 14 dias.

Teste local verde até no S23, e o staging ainda achou um defeito.08 nov · DesenvolvimentoOutra IA revisou 4.170 traduções da IA em inglês e corrigiu 307.08 nov · Inteligência artificialA conta live do Stripe estava ativa, mas falhou na minha conferência.08 nov · LançamentoTrês regras de HSTS num só domínio: por que deixei o preload de fora.08 nov · DesenvolvimentoUma palavra a menos derrubou 13 páginas que já estavam no ar.08 nov · DesenvolvimentoOutro agente de IA revisou meu código 71 vezes e criou dois defeitos.08 nov · Inteligência artificialDepois de 20 anos de carreira, publiquei meu primeiro pacote no npm.08 nov · LançamentoSozinho com IA: iPhone, Android, SaaS com MCP e CLI, e já faturando.07 nov · BastidoresCopiei a mecânica dos líderes e recusei a mentira deles.07 nov · BastidoresA pergunta de LGPD que trava a venda: e o backup?07 nov · ProdutoA IA calibrou minha câmera pelos números. Ficou cara de lanterna.07 nov · BastidoresUm usuário não via o dia de ontem. Abri todo o passado do Garfim.07 nov · Produto62% baixavam o Garfim. O problema estava antes da página.07 nov · LançamentoO idioma certo na tela pode virar o errado no servidor.07 nov · DesenvolvimentoO limite de 10 por minuto que deixou passar muito mais.07 nov · DesenvolvimentoUm PR do Dependabot travou meu banco e as rotas voltaram 500.07 nov · DesenvolvimentoMeus produtos novos não começam do zero. Começam de um clone.07 nov · DesenvolvimentoTirei uma trava da minha IA e a resposta caiu de 5,5 s para 3,7 s.07 nov · DesenvolvimentoTroquei velocidade por uma auditora que confere cada frase.07 nov · Inteligência artificialEscrevi o método CERNE lendo seis especificações reais.07 nov · Inteligência artificialComo anunciar na Meta e vender online no CPF sem abrir empresa.05 nov · BastidoresPausei anúncios depois de ignorar o resultado anterior.05 nov · BastidoresComo depurei um erro de API sem log no registro do Garfim.05 nov · DesenvolvimentoComo forçar atualização no React Native antes de um defeito grave.05 nov · DesenvolvimentoComo levei o LCP do ClipLeve de 9,9 s para menos de 1,5 s.05 nov · DesenvolvimentoPubliquei 650 páginas contra a regra do meu método.05 nov · Inteligência artificialUma conta para organizar erros, métricas e IA dos meus produtos.05 nov · BastidoresSeparei o painel do site e pus o Access na porta.05 nov · DesenvolvimentoUma lista de 69 itens encontrou requisitos só no papel.05 nov · BastidoresO antispam esperou tanto que parou o formulário.05 nov · DesenvolvimentoCortei a publicação de 17 minutos para 4 na minha máquina.05 nov · DesenvolvimentoEu gravo. A IA corta, legenda e entrega o vídeo curto.05 nov · Inteligência artificialComo criar anúncios UGC com IA usando o método PROVA.05 nov · Inteligência artificialA IA disse que usou as skills. A página provou o contrário.05 nov · Inteligência artificialNove páginas reprovadas antes de encontrar uma identidade.05 nov · Inteligência artificialEm 48 horas, juntei domínios, e‑mail, sites e medição num padrão só.30 out · BastidoresPor que tirei os três sites do GPT Sites.30 out · DesenvolvimentoComo troquei o luisjunior.ai com cerca de 10 segundos fora do ar.30 out · DesenvolvimentoRefiz o luisjunior.ai do zero: cada afirmação com prova.30 out · LançamentoUm padrão para todos os domínios, inclusive os de produtos futuros.30 out · BastidoresTodo o e‑mail dos meus domínios saiu do VPS num só dia.30 out · DesenvolvimentoDecidi mover o envio do Garfim do Resend para a Cloudflare.30 out · DesenvolvimentoO método FONTE para aparecer no Google e nas respostas de IA.30 out · Inteligência artificialTrês sites, três decisões de busca, e uma delas é não gerar páginas.30 out · Inteligência artificialMedição de vários sites num painel só, com consentimento.30 out · BastidoresComo a IA me apresenta mídias para aprovação29 out · Inteligência artificialO Garfim chegou ao Google Play. Agora tem Android e iPhone.22 out · LançamentoConseguir testadores e esperar 14 dias: a reta final do Garfim no Android.22 out · BastidoresO ClipLeve chegou à App Store. O que aprendi até aqui.20 out · LançamentoO ClipLeve foi rejeitado de novo. Dessa vez, por uma palavra.20 out · ProdutoO Garfim foi aprovado. E já está na App Store.16 out · LançamentoA última negativa do Garfim: câmera, assinatura e o caminho inteiro.16 out · LançamentoClipLeve: o cuidado por trás de um vídeo mais leve.12 out · ProdutoPor que restaurar uma assinatura pode falhar em outra conta.12 out · ProdutoQuando um aplicativo pode dizer que sua conta foi excluída?12 out · ProdutoO que a primeira negativa da App Store me fez explicar.08 out · LançamentoO que quero aprender com o teste fechado do Garfim.08 out · ProdutoO trabalho de uma assinatura continua depois da compra.03 out · DesenvolvimentoPor que o Garfim ganhou um plano gratuito.03 out · ProdutoO login funcionou. Por que a tela do Garfim não saiu do lugar?03 out · LançamentoPagenello: um site começa pelo que o visitante veio fazer.03 out · LançamentoComo uma foto do almoço vira um produto.27 set · ConcepçãoAs decisões que continuo tomando ao desenvolver com IA.27 set · DesenvolvimentoApresentar o Garfim ao público também é um teste do produto.27 set · Lançamento

GET luisjunior.ai/llms.txt

Esta é a versão do site escrita para modelos de linguagem: os mesmos fatos, sem layout, prontos para um assistente de IA ler e citar. Agentes no Chrome também encontram aqui ferramentas WebMCP para consultar produtos, textos e contato.

conectando…0 tokens · 0 tok/s