Noções Básicas de Atualizações OTA
10 exemplos para você começar com Atualizações Over-The-Air (OTA) no Expo SDK 57 - o que o EAS Update pode alterar em minutos versus o que ainda requer uma submissão para a App Store ou Play Store.
Busque em todas as páginas da documentação
10 exemplos para você começar com Atualizações Over-The-Air (OTA) no Expo SDK 57 - o que o EAS Update pode alterar em minutos versus o que ainda requer uma submissão para a App Store ou Play Store.
Atualizações OTA exigem expo-updates em um binário de release ou preview - não no Expo Go.
npx create-expo-app@latest MyOtaApp --template blank-typescript
cd MyOtaApp
npx expo install expo-updates
npx eas init
npx eas update:configureFerramentas: Estes exemplos visam Expo SDK 57 (
expo~57.0.4), React Native 0.86.0 e React 19.2.3.
Toda decisão de release mobile começa com uma pergunta: esta alteração afeta o código nativo?
Alteração apenas de JavaScript / assets → eas update (minutos)
Shell nativo / permissões / SDK → eas build + submissão na loja (dias)Relacionado: expo-updates (API do Cliente) - verificando e aplicando atualizações a partir do código do app
Erros de lógica puramente em JavaScript são o caso de uso clássico para OTA - nenhuma fronteira nativa foi cruzada.
// src/screens/CheckoutScreen.tsx - correção de erro de digitação enviada via OTA
export function CheckoutScreen() {
const total = useCartTotal();
return (
<View>
<Text>Total: {formatCurrency(total)}</Text>
{/* Corrigido: estava dividindo por 100 duas vezes */}
<PrimaryButton label="Pagar agora" onPress={submitPayment} />
</View>
);
}# Após a fase de teste de pré-visualização
eas update --channel production --environment production --message "Corrige exibição do total do checkout"preview; faça a fase de teste antes de ir para production em caminhos de receitaRelacionado: Canais de Release & Branches - promoção de staging → production
Imagens empacotadas, fontes referenciadas a partir do JS e JSON Lottie são enviadas com o manifesto de atualização.
// src/components/HeroBanner.tsx
import heroImage from "@/assets/hero-summer.png";
export function HeroBanner() {
return <Image source={heroImage} style={{ width: "100%", height: 200 }} />;
}Instalar um pacote com código nativo altera a saída ios/ e android/ - OTA não pode adicioná-lo.
# Esta sequência requer eas build + submissão na loja, NÃO apenas eas update
npx expo install react-native-vision-camera// app.config.ts - novo plugin = nova build nativa
export default {
expo: {
plugins: [
[
"react-native-vision-camera",
{ cameraPermissionText: "Precisamos de acesso à câmera para escanear códigos de barras." },
],
],
},
};npx expo prebuild é o sinal - se o projeto nativo mudar, planeje uma build da lojaRelacionado: Noções Básicas de EAS Build - builds na nuvem que recebem atualizações
A cópia de permissão vive nos manifestos nativos - os usuários verão texto desatualizado se você fizer OTA sem reconstruir.
{
"expo": {
"ios": {
"infoPlist": {
"NSCameraUsageDescription": "Escaneie códigos de barras para adicionar itens ao seu carrinho."
}
},
"android": {
"permissions": ["android.permission.CAMERA"]
}
}
}infoPlist, permissions ou entitlements precisa de eas buildAtualizações de SDK mudam o runtime nativo, a versão do Hermes e as dependências nativas padrão.
{
"dependencies": {
"expo": "~57.0.4",
"react": "19.2.3",
"react-native": "0.86.0"
}
}eas build para todos os perfis, depois retome eas update na nova linha de runtimeRelacionado: Política de Versão de Runtime - estratégias de
appVersion,nativeVersione fingerprint
runtimeVersion informa ao EAS Update quais bundles JS um binário pode baixar. Incompatibilidade = ignorar silenciosamente.
// app.config.ts
export default {
expo: {
version: "2.4.0",
runtimeVersion: {
policy: "appVersion",
},
updates: {
url: "https://u.expo.dev/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
},
},
};# A build incorpora o runtime 2.4.0
eas build --profile production --platform all
# A atualização deve ter como alvo o mesmo runtime
eas update --channel production --environment productioneas build e bundles do eas update devem compartilhar o mesmo runtimeVersion resolvidonpx expo config --type public | jq '.runtimeVersion'Relacionado: Configuração do expo-updates - cookbook completo do
app.config
Copie esta tabela para o seu runbook de release e exija uma caixa de seleção para cada alteração.
| Alteração | OTA? | Loja? | Notas |
|---|---|---|---|
| Correção de bug JS | ✅ | - | Fase de teste de pré-visualização primeiro |
| Nova tela React (sem novo nativo) | ✅ | - | Fique atento ao tamanho do bundle |
Novo módulo nativo expo install | - | ✅ | Aumente o runtime; proteja o JS |
| Plugin de configuração adicionado/alterado | - | ✅ | Diferença de prebuild necessária |
| Ícone do app / ícone adaptativo | - | ✅ | Pipeline de assets nativos |
| Ícone de notificação push (Android) | - | ✅ | Recurso nativo |
| Cópia remota / tokens de tema em JS | ✅ | - | Sem toque nativo |
| Migração de esquema SQLite em JS | ✅ | ⚠️ | Teste o caminho de upgrade; migração ruim pode quebrar |
| Alteração que quebra API | ✅ | ⚠️ | JS antigo deve tolerar API antiga |
| Bytecode Hermes / tamanho do bundle | ✅ | - | Trate como evento de release |
OTA permite que você envie JS rapidamente; flags de recursos permitem que você controle quem o executa.
// src/features/barcode/useBarcodeScanner.ts
import * as Application from "expo-application";
const MIN_NATIVE_FOR_SCANNER = "2.4.0";
export function useBarcodeScannerEnabled(remoteFlag: boolean) {
const nativeVersion = Application.nativeApplicationVersion ?? "0.0.0";
const nativeReady = compareSemver(nativeVersion, MIN_NATIVE_FOR_SCANNER) >= 0;
return remoteFlag && nativeReady;
}Application.nativeApplicationVersion reflete o binário da loja, não o ID do bundle do OTARelacionado: Flags de Recursos para Rollout Seguro - kill switches ao lado do OTA
Suporte e resposta a incidentes precisam do ID da atualização - não apenas da versão de marketing.
// app/_layout.tsx (apenas diagnósticos de dev/preview)
import * as Updates from "expo-updates";
import { useEffect } from "react";
export default function RootLayout() {
useEffect(() => {
if (__DEV__) return;
console.info("[updates]", {
updateId: Updates.updateId,
runtimeVersion: Updates.runtimeVersion,
channel: Updates.channel,
isEmbeddedLaunch: Updates.isEmbeddedLaunch,
});
}, []);
return <Stack />;
}Updates.updateId identifica o bundle OTA; Updates.isEmbeddedLaunch verdadeiro significa que nenhum OTA foi aplicado aindaNão. OTA substitui bundles JavaScript e assets baixáveis. Módulos nativos, permissões, entitlements, versão do SDK e ícones de aplicativos exigem eas build e submissão na loja.
Não. O Expo Go usa um shell nativo genérico sem sua configuração de canal expo-updates. Teste OTA em builds com perfil de pré-visualização ou produção do EAS.
Após a publicação, os dispositivos verificam no lançamento (de acordo com sua política checkAutomatically). Os usuários podem precisar de uma reinicialização. Correções críticas podem forçar a recarga via expo-updates (API do Cliente).
O aplicativo trava na importação ou na primeira chamada nativa - muitas vezes imediatamente no lançamento. Faça rollback do canal e envie uma build da loja. Prevenção: fase de teste de pré-visualização + guards de runtime + Regras de Release & OTA.
Eles recebem OTAs apenas para sua linha de runtimeVersion. Monitore a distribuição do runtime semanalmente; imponha uma versão nativa mínima quando a segurança exigir.
runtimeVersion, URL, verificação no lançamentoVersõ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).
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026