EAS Submit iOS: publicar app Expo na App Store
Por Mehdi Azizi
Publicado em , 8 min
O EAS Submit envia seu build iOS ao App Store Connect, onde ele aparece no TestFlight. O envio para revisão continua sendo feito no App Store Connect.
eas submit --platform ios envia seu build iOS ao App Store Connect, onde ele aparece no TestFlight depois do processamento pela Apple. O comando não envia seu app para a revisão da Apple: a escolha do build e o envio para revisão continuam sendo feitos no App Store Connect. Para automatizar, ele precisa do número do registro do seu app (ascAppId) e de uma chave de API do App Store Connect.
Eu publico meus apps iOS, entre eles Solys, TradaZen e Nolera, com Expo, EAS Build e EAS Submit. Este guia segue a documentação do Expo sobre o envio iOS, revisada em 25 de outubro de 2026. Sem Mac, o caminho completo está em publicar um app iOS sem Mac. Aqui, o foco é o envio.
O que você precisa antes do primeiro comando
O Expo lista três pré-requisitos:
- Uma conta Apple Developer paga. O preço e a inscrição estão em conta de desenvolvedor Apple.
- Um identificador de bundle em
ios.bundleIdentifier. Segundo a referência da configuração do Expo, você mesmo o inventa, mas ele precisa ser único na App Store. - EAS CLI instalado, e depois
eas logincom sua conta Expo.
Você também precisa de um build de produção assinado. O EAS Build gera esse build com o certificado e o perfil que ele gerencia para você, como explico em certificado e provisioning profile iOS.
O registro no App Store Connect: você ou o EAS?
O EAS Submit envia um binário para um app que precisa existir no App Store Connect.
Você pode criar o registro você mesmo. A ajuda da Apple descreve a janela New App: plataforma, nome, idioma principal, identificador de bundle, SKU e acesso dos usuários. É preciso ter a função Account Holder, Admin ou App Manager.
O EAS também pode criar no primeiro envio. Segundo a página do Expo sobre o TestFlight, o eas submit cria o registro quando você envia seu primeiro build. Segundo a referência do eas.json, preencher ascAppId pula essa etapa. O nome vem de appName ou, na falta dele, do name da sua configuração. O idioma principal vem de language, que é en-US por padrão. Se o seu app vai sair primeiro em francês, preencha language antes desse primeiro envio.
Depois, copie o número do registro em ascAppId. O Expo explica onde encontrar: abra seu app no App Store Connect e vá em App Information. É o campo Apple ID, em General Information. É um número, não o seu identificador de bundle.
Por que uma chave de API em vez do seu Apple ID
O EAS Submit se conecta à Apple com o seu Apple ID ou com uma chave de API do App Store Connect.
O Apple ID esbarra na autenticação de dois fatores, que a Apple exige de todos os usuários do App Store Connect: alguém precisa confirmar o login. A senha de app, passada em EXPO_APPLE_APP_SPECIFIC_PASSWORD, evita essa etapa, mas o Expo a considera menos segura que a chave de API, que é o método padrão e recomendado por ele. A chave permite autenticar sem nenhuma interação e, portanto, automatizar o envio.
Dois caminhos para obtê-la:
- Deixe o EAS gerenciar. Rode
eas credentials --platform ios, escolha o perfilproduction, entre na sua conta Apple e escolha "App Store Connect: Manage your API Key". - Traga sua própria chave. No App Store Connect: Users and Access, aba Integrations, App Store Connect API, Team Keys e depois Generate API Key. É preciso uma conta Admin, e o guia do Expo dá a função Admin à chave.
No segundo caso, anote o Key ID, exibido na lista de chaves ativas, e o Issuer ID, no topo da página Integrations. E guarde bem o arquivo .p8: você só pode baixá-lo uma vez, e a Apple não guarda nenhuma cópia.
Segundo a Apple, uma chave Admin pode criar e excluir usuários da sua conta. A Apple pede para nunca guardar a chave em um repositório de código.
O eas.json mínimo para copiar
Todos os valores são fictícios: substitua pelos seus.
{
"cli": {
"appVersionSource": "remote"
},
"build": {
"production": {
"autoIncrement": true
}
},
"submit": {
"production": {
"ios": {
"ascAppId": "1234567890",
"appleTeamId": "ABCDE12345",
"ascApiKeyPath": "./keys/AuthKey_XXXXXXXXXX.p8",
"ascApiKeyIssuerId": "seu-issuer-id",
"ascApiKeyId": "XXXXXXXXXX"
}
}
}
}
appVersionSourceeautoIncrement: os servidores do EAS guardam o número de build e o incrementam a cada build de produção. O Expo recomenda esse modo remoto desde o EAS CLI 12.ascAppId: o número do registro do seu app. Sem ele, o modo não interativo falha.appleTeamId: o identificador da sua equipe Apple Developer.ascApiKeyPath,ascApiKeyIssuerId,ascApiKeyId: sua chave de API. Os três campos aceitam variáveis de ambiente. Adicione a pastakeysao seu.gitignore.
O campo appleId só serve se você entrar com seu Apple ID. Se o EAS já gerencia sua chave, remova também os três campos ascApiKey. Nos meus três apps, revisados em 25 de outubro, o perfil de envio de produção só tem ascAppId, mais appleTeamId no Solys: nenhuma chave no arquivo.
Rodar o build e depois o envio
eas build --platform ios --profile production
eas submit --platform ios
Sem outra opção, o eas submit pede para você escolher o build a enviar e, na primeira execução, pede seu Apple ID. O perfil de envio production é usado por padrão se existir. A referência do EAS CLI lista as opções que evitam essa escolha:
| Opção | O que ela faz |
|---|---|
--latest | Envia o último build iOS |
--id | Envia um build EAS específico |
--path | Envia um arquivo .ipa local |
--url | Envia um arquivo online |
--groups | Adiciona a um grupo interno |
--what-to-test | Preenche "What to test" |
Para encadear tudo, adicione --auto-submit ao comando de build. Segundo a página do Expo sobre o envio automático, o build concluído vai para o EAS Submit com o perfil de envio de mesmo nome do perfil de build. Para escolher outro: --auto-submit-with-profile=nome. O build vai para o TestFlight, não para a revisão.
Em integração contínua, adicione --non-interactive e um token EXPO_TOKEN. Aí o comando não pode perguntar nada: ele precisa de ascAppId no perfil e de uma chave de API, a que o EAS vinculou ao app ou a sua nos três campos ascApiKey.
O que acontece depois do envio
1. A Apple processa o build. Ele precisa passar por esse processamento antes de aparecer no App Store Connect, e a Apple manda um e-mail no final. O Expo fala em geral de 10 a 15 minutos até ele aparecer no TestFlight.
2. A conformidade de exportação. O status Missing Compliance quer dizer que falta sua declaração sobre criptografia. O App Store Connect faz essas perguntas a cada nova versão, a menos que o Info.plist já responda. Com Expo, a chave se chama ios.config.usesNonExemptEncryption:
{
"expo": {
"ios": {
"config": {
"usesNonExemptEncryption": false
}
}
}
}
Segundo a Apple, false serve se o seu app, incluindo as bibliotecas, não usa nenhuma criptografia ou só criptografia isenta. A criptografia do sistema, como o HTTPS via URLSession, em geral é isenta. Só declare false se for verdade para o seu app: a declaração é responsabilidade sua. Como qualquer chave do Info.plist, ela exige um novo build.
3. TestFlight. No status Ready to Submit, segundo a Apple, o build pode ir para os testadores internos, passar pela revisão beta para os externos ou ir para a revisão da App Store. O campo groups do perfil adiciona o build aos seus grupos internos. Todo o resto está em TestFlight para testar seu app.
O envio não é a submissão para revisão
O Expo deixa claro: um build do TestFlight não é publicado automaticamente na App Store. O EAS Submit não preenche nem a página do app, nem as capturas de tela. Faltam quatro passos no App Store Connect, descritos na ajuda da Apple sobre o envio para revisão:
- Preencha os metadados obrigatórios da versão.
- Escolha o build na seção Build da versão.
- Clique em "Add for Review". A versão passa para Ready for Review, mas nada foi enviado para revisão ainda.
- Clique em "Submit for Review". O status passa para In Review quando a revisão começa.
Os erros comuns e como corrigir
| Erro exibido | Causa | Correção |
|---|---|---|
| ITMS-90189 | Número de build já usado | autoIncrement |
| ITMS-90062 ou 90186 | Versão já fechada | Subir version |
| "Set ascAppId" | ascAppId ausente no CI | Adicionar ascAppId |
| "API Keys cannot" | Nenhuma chave vinculada | eas credentials |
| ITMS-90683 | Texto de permissão ausente | ios.infoPlist |
| ITMS-91053 | Manifesto incompleto | ios.privacyManifests |
| ITMS-90725 | SDK iOS antigo demais | Subir o SDK do Expo |
| Missing Compliance | Criptografia não declarada | usesNonExemptEncryption |
Segundo o Expo, o número de build já usado é uma causa comum de recusa no envio: está tudo em número de build e versão. Três erros têm guia próprio: ITMS-90683 com Expo, ITMS-91053 com Expo e ITMS-90725.
As duas mensagens entre aspas vêm do EAS e se corrigem na configuração dele. Missing Compliance também se resolve respondendo às perguntas no App Store Connect. Para todas as outras linhas, a correção mexe no binário: faça um novo build e envie de novo. Uma atualização remota não muda nem o Info.plist, nem o manifesto, nem os números.
Enviar seu primeiro app sem tentativa e erro
O comando é só uma etapa. O iOS Kit parte do código inicial dos meus apps, assinaturas incluídas, e segue quatro etapas até a App Store, no seu ritmo.
Se você está preparando seu primeiro lançamento, faça seu diagnóstico gratuito: ele mostra o que realmente está travando você e envia meu checklist anti-rejeição da Apple. Para a página do app, as capturas de tela e a aprovação, a página publicar um aplicativo na App Store cobre cada etapa.
Perguntas frequentes
Como publicar um app Expo na App Store?
Rode um build de produção com o EAS Build e envie com eas submit --platform ios. Depois do processamento pela Apple, ele aparece no TestFlight. No App Store Connect, preencha a página do app, escolha esse build na versão e clique em "Add for Review" e depois em "Submit for Review".
O EAS Submit envia meu app para a revisão da Apple?
Não. O EAS Submit envia o binário ao App Store Connect, e o build chega ao TestFlight. O envio para revisão é feito manualmente no App Store Connect, depois de preencher a página do app e escolher o build.
Onde encontrar o ascAppId do meu app?
No App Store Connect, abra seu app e vá em App Information. É o campo Apple ID, em General Information. É um número, que não deve ser confundido com o seu identificador de bundle.
Preciso de um Apple ID para usar o eas submit?
Na primeira execução, o comando pede. Depois, com ascAppId no perfil e uma chave de API do App Store Connect, ele pode rodar sem interação, até em integração contínua. A chave de API é o método padrão e recomendado pelo Expo.
Quanto tempo até ver o build no TestFlight?
O Expo fala em geral de 10 a 15 minutos de processamento na Apple, que manda um e-mail no final. Se o build ficar no status Missing Compliance, responda às perguntas sobre criptografia e depois declare isso na sua configuração para os próximos builds.