-
Sempre adicione módulos Expo com npx expo install: npm install simples pode puxar ABIs nativas não testadas contra seu expo fixado - execute npx expo install --fix após cada atualização do SDK.
-
Trate expo ~57.0.4 como o contrato: Cada versão expo-* é validada contra o SDK 57 - misturar gerações causa falhas de compilação nativa, não erros graciosos de JS.
-
Execute npx expo doctor antes de compilações nativas: Detecta cópias duplicadas do React Native, versões incorretas de módulos e plugins de configuração ausentes antes de gastar minutos caros de EAS.
-
Plugins de configuração exigem um novo binário: Strings de permissão, modos de segundo plano e ícones de notificação não são seguros para OTA - planeje lançamentos na loja quando os plugins mudarem.
-
Pré-solicite antes dos diálogos de permissão do SO: Mostre a justificativa no aplicativo (por que + benefício) em uma tela dedicada - solicitar na primeira montagem maximiza negações permanentes.
-
Combine as strings do plugin com o texto no aplicativo: O iOS App Review compara as descrições de uso do Info.plist com a interface do usuário - uma cópia vaga "precisa de localização" falha na revisão.
-
Ofereça caminhos de negação graciosa: Quando os usuários negam, mostre orientação Linking.openSettings() e um modo degradado que ainda entrega o valor principal sem a capacidade.
-
Solicite o nível de permissão mais restrito primeiro: Localização Quando em Uso antes de Sempre; câmera apenas quando o usuário toca em capturar; biblioteca de fotos apenas para seleções da galeria.
-
Registre tarefas do TaskManager no escopo global: defineTask na entrada do aplicativo - nunca dentro de componentes - ou interrupções de segundo plano de inicialização a frio não encontrarão um manipulador.
-
Importe manipuladores de notificação antes do primeiro push: Efeito colateral setNotificationHandler no topo de index.ts ou _layout.tsx - não preguiçosamente dentro de uma tela.
-
Crie canais de notificação Android antes de postar: Android 8+ descarta silenciosamente notificações sem um canal - separe canais transacionais e de marketing.
-
Registre tokens push no lado do servidor por dispositivo: Atualize na reinstalação; exclua no logout - tokens no estado React sozinhos não sobrevivem à morte do processo.
-
Teste push e localização em segundo plano em compilações de desenvolvimento: Expo Go é insuficiente para QA final de credenciais, ícones e UIBackgroundModes.
-
Pare os watches de localização ao desmontar: Limpeza subscription.remove() em useEffect - watchers esquecidos drenam a bateria e vazam callbacks.
-
Redimensione imagens antes da pré-visualização e upload: URIs de resolução total em <Image> causam OOM em Android de nível médio - redimensione para 1280–1920px e JPEG 0.7–0.8.
-
Armazene caminhos de arquivo no SQLite, não blobs: Fotos e PDFs vivem em expo-file-system; bancos de dados contêm apenas URIs e metadados.
-
Prefira File / Directory / Paths do SDK 57: Use expo-file-system/legacy apenas durante a migração - a concatenação de strings de URI é um bug comum de caminho no Android.
-
Nunca armazene tokens de atualização no AsyncStorage ou arquivos simples: Use expo-secure-store com WHEN_UNLOCKED_THIS_DEVICE_ONLY - veja ../auth-session/securestore-and-keychain-keystore/securestore-and-keychain-keystore.md.
-
Use expo-crypto para aleatoriedade e digests: Verificadores PKCE e nonces precisam de getRandomBytes - nunca Math.random(); hasheie chaves de cache, não senhas para autenticação de servidor.
-
Limpe o SecureStore no logout e troca de conta: Chaves de namespace por userId; emparelhe com queryClient.clear() e reinício de navegação - entradas de cofre obsoletas são um defeito de segurança.
-
Atualizações OTA mudam apenas JS: Adições de módulos nativos, strings de permissão e atualizações de SDK precisam de um binário de loja - use expo-updates check/fetch/reload apenas para correções de bundle.
-
Solicite antes de reloadAsync: Recarregar no meio do formulário perde o estado - busque silenciosamente, recarregue em telas ociosas ou após consentimento explícito do usuário.
-
Trate tarefas em segundo plano como uma rede de segurança: O flush do NetInfo em primeiro plano é o principal; minimumInterval: 15 minutos não é em tempo real - agrupe o trabalho e retorne Success/Failed honestamente.
-
Mantenha os manipuladores de segundo plano livres de React: Abra SQLite e fetch imperativamente dentro de defineTask - hooks e clientes de Query não existem na entrada de ativação do SO.
-
Documente as matrizes de capacidade por sabor de compilação: Mantenha uma tabela de quais recursos do SDK funcionam no cliente de desenvolvimento vs produção - evita o envio de recursos que só funcionavam no Expo Go.
Versões da Stack: Esta página foi escrita para React 19.2.3, React Native 0.86.0 e Expo SDK 57 (expo ~57.0.4).