Pitch: o módulo nativo que compilava em todo build e nunca era registrado (Expo + widget + Apple Watch)
Olá, TabNews. Desenvolvo de forma independente o FitStreak, um app de hábito de treino para iPhone (com widget e app para Apple Watch). Queria compartilhar um problema técnico que me custou caro, porque acho que pode poupar tempo de quem mistura React Native/Expo com código nativo.
O contexto
O app é React Native + Expo, mas o widget da tela inicial, o app do Apple Watch, a complicação do relógio e os atalhos da Siri são targets nativos em Swift. Eles compartilham dados com o app por App Groups, por meio de um módulo nativo local que escreve no container compartilhado e manda dados para o relógio via WatchConnectivity.
O bug
Durante várias versões, o widget e o relógio simplesmente não recebiam nada nos aparelhos reais. Sem crash, sem erro visível. E todos os sinais diziam que estava tudo certo:
- o build do EAS passava;
- a assinatura e a validação da App Store passavam;
- a classe do módulo estava dentro do IPA.
A causa
O podspec do módulo ficava na raiz do módulo. O autolinking do React Native compilava o pod normalmente, mas o resolve do Expo só procura em subpastas, então o módulo nunca era registrado no ExpoModulesProvider.swift. Resultado: requireNativeModule('WidgetData') falhava em todo launch real, e as chamadas viravam no-op silencioso.
A correção foi uma linha: apple.podspecPath no expo-module.config.json. Hoje existe um teste que roda o resolver de verdade e falha se o módulo não for registrado.
Como encontrei
Não foi por nenhum build. Foi pelo log unificado do iPhone (sudo log collect --device-udid ... e depois log show filtrando pelo processo wcd). Um app com WCSession funcionando aparece como cliente do wcd segundos depois de abrir; o nosso não aparecia.
Lição: compilar, assinar e passar na validação são três portões diferentes, e nenhum deles prova que o módulo foi registrado. Se você tem targets nativos junto com Expo, teste o registro, não só a compilação.
O app
Se tiver curiosidade: o FitStreak tem treinos guiados com demonstração passo a passo, programas de 30 dias, sequências (streaks) com dias de descanso planejados que não quebram a sequência, e um pet que cresce junto com a sequência. Está em português, é gratuito para baixar, com assinatura opcional.
https://apps.apple.com/br/app/id6759306186
Feedback é muito bem-vindo, principalmente sobre o onboarding.
(Texto traduzido com ajuda de IA; respondo em inglês.)