Configuração do expo-updates
Versão de runtime, URL de atualização e políticas de verificação no lançamento - o cookbook do app.config para conectar o EAS Update a aplicativos Expo SDK 57 para que binários e pacotes OTA permaneçam compatíveis.
Busque em todas as páginas da documentação
Versão de runtime, URL de atualização e políticas de verificação no lançamento - o cookbook do app.config para conectar o EAS Update a aplicativos Expo SDK 57 para que binários e pacotes OTA permaneçam compatíveis.
Cartão de receita de referência rápida - pronto para copiar e colar.
npx expo install expo-updates
npx eas init
npx eas update:configure// app.config.ts
import type { ExpoConfig } from "expo/config";
const config: ExpoConfig = {
name: "ShopApp",
slug: "shop-app",
version: "2.4.0",
runtimeVersion: {
policy: "appVersion",
},
extra: {
eas: {
projectId: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
},
},
updates: {
url: "https://u.expo.dev/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
checkAutomatically: "ON_LOAD",
fallbackToCacheTimeout: 0,
requestHeaders: {
"expo-channel-name": "production",
},
},
};
export default config;# Verifique a configuração pública resolvida
npx expo config --type public | jq '{runtimeVersion, updates}'
# Publique com o ambiente EAS (SDK 55+)
eas update --channel production --environment production --message "Config verified"Quando usar isso:
eas init.runtimeVersion ou canal).requestHeaders e projectId por variante.Quando evitar:
eas build.development - use perfis de build em vez disso.expo start aplique OTA - as atualizações são desativadas no modo de desenvolvimento.Um app.config.ts pronto para produção com cabeçalhos de canal orientados por perfil, política de runtime explícita e política de verificação de inicialização.
Etapa 1 - Canais eas.json por perfil de build
{
"cli": { "version": ">= 16.0.0" },
"build": {
"development": {
"developmentClient": true,
"distribution": "internal",
"channel": "development"
},
"preview": {
"distribution": "internal",
"channel": "preview"
},
"production": {
"channel": "production"
}
}
}Etapa 2 - app.config.ts dinâmico
// app.config.ts
import type { ExpoConfig } from "expo/config";
const EAS_PROJECT_ID = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx";
const channel =
process.env.EAS_BUILD_PROFILE === "preview"
? "preview"
: process.env.EAS_BUILD_PROFILE === "development"
? "development"
: "production";
const config: ExpoConfig = {
name: "ShopApp",
slug: "shop-app",
version: "2.4.0",
runtimeVersion: { policy: "appVersion" },
extra: { eas: { projectId: EAS_PROJECT_ID } },
updates: {
url: `https://u.expo.dev/${EAS_PROJECT_ID}`,
checkAutomatically: "ON_LOAD",
fallbackToCacheTimeout: 0,
requestHeaders: { "expo-channel-name": channel },
},
ios: { bundleIdentifier: "com.example.shopapp" },
android: { package: "com.example.shopapp" },
};
export default config;Etapa 3 - Primeira build nativa após a configuração
eas build --profile preview --platform all
eas update --channel preview --environment preview --message "Smoke test channel wiring"O que isso demonstra:
runtimeVersion.policy: "appVersion" vincula o direcionamento OTA ao expo.versionupdates.url usa o UUID do projeto EAS de extra.eas.projectIdrequestHeaders["expo-channel-name"] deve corresponder ao channel do perfil em eas.jsoncheckAutomatically: "ON_LOAD" verifica em cada inicialização fria; fallbackToCacheTimeout: 0 nunca bloqueia o lançamento em rede| Política | Resolve para | Melhor para |
|---|---|---|
appVersion | string expo.version | A maioria dos aplicativos de consumidor; modelo mental simples |
nativeVersion | Números de build da plataforma | Equipes que incrementam o número de build para cada alteração nativa |
fingerprint | Hash do estado do projeto nativo | Monorepos com derivação nativa frequente |
"1.0.0" (string estática) | Valor literal | Brownfield com runtime nativo fixo |
// Runtime estático explícito (avançado / brownfield)
runtimeVersion: "shop-native-2026-q1",| Valor | Comportamento |
|---|---|
ON_LOAD | Verifica a cada inicialização fria (recomendação padrão) |
ON_ERROR_RECOVERY | Verifica apenas após recuperação de falha |
WIFI_ONLY | Verifica no lançamento quando conectado ao Wi-Fi |
NEVER | Nenhuma verificação automática - você chama checkForUpdateAsync manualmente |
updates: {
checkAutomatically: "ON_LOAD",
fallbackToCacheTimeout: 0, // 0 = nunca bloqueia o lançamento esperando pela rede
},fallbackToCacheTimeout: 3000 bloqueia o lançamento por até 3s para um pacote atualizado - use com moderaçãoeas.json build.profile.channel → embutido no binário em eas build
app.config updates.requestHeaders → enviado a cada verificação de atualização
eas update --channel <name> → publica o pacote nesse canaleas update:configure gera updates.url e projectId - não substitui a disciplina de perfilprojectId, canal e ID do pacote separados por variante de aplicativo# SDK 55+ - o .env local NÃO é usado nos executores de atualização EAS
eas update --channel production --environment productionpreview e productionEXPO_PUBLIC_* entre eas build e eas update para o mesmo canalupdates.url ausente - Updates.isEnabled é falso. Correção: eas update:configure + reconstruir.runtimeVersion - A build usou 2.4.0, a atualização foi publicada sob 2.5.0 após o aumento da versão sem reconstrução. Correção: Reconstruir binários ou publicar no runtime correspondente.production codificado em hard-code no perfil de desenvolvimento - O QA de preview recebe OTAs de produção. Correção: Direcionar o cabeçalho a partir de EAS_BUILD_PROFILE.expo-updates. Correção: Nova eas build após adicionar a configuração de atualizações.fallbackToCacheTimeout bloqueante em redes lentas - Os usuários ficam olhando para a splash screen. Correção: Mantenha 0 a menos que você tenha uma UX de atualização offline forte.--environment - Hosts de API desatualizados ou incorretos embutidos no pacote OTA. Correção: Sempre passe --environment no SDK 55+.| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
checkAutomatically: "ON_LOAD" | Atualidade padrão | Você precisa de controle totalmente manual |
checkAutomatically: "NEVER" + API do cliente | UX de banner personalizada | A equipe esquece de implementar verificações |
runtimeVersion estático | Host brownfield fixo | A versão de marketing deve direcionar a segmentação |
Política fingerprint | Alterações nativas sem aumentos de versão | A equipe não possui validação de fingerprint em CI |
Sim - checkAutomatically e fallbackToCacheTimeout são embutidos no manifesto nativo no momento da build. Alterá-los requer uma nova eas build.
eas update:configure grava https://u.expo.dev/<projectId> usando seu extra.eas.projectId. Verifique com npx expo config --type public.
Sim. As mesmas chaves updates e runtimeVersion se aplicam. A seleção dinâmica de canal via process.env.EAS_BUILD_PROFILE é o padrão comum.
Construa o perfil preview → publique eas update --channel preview → instale a build interna → confirme Updates.channel e Updates.runtimeVersion nos logs.
Clientes de desenvolvimento podem apontar para o canal development, mas __DEV__ e as ferramentas de desenvolvimento diferem da produção. Valide o comportamento OTA apenas em perfis preview/production.
eas.jsonVersõ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