# Erros do eas submit no iOS: causas e como corrigir

> O eas submit falhou? As mensagens reais do EAS e do App Store Connect, a causa e a correção: ascAppId, chave de API, contrato da Apple, códigos ITMS.

Página original: [Erros do eas submit no iOS: causas e como corrigir](https://devoria.fr/pt-br/blog/erros-eas-submit-ios-como-corrigir)
Autor: [Mehdi Azizi](https://devoria.fr/pt-br/mehdi-azizi)
Publicação: 2026-11-04
Última revisão do conteúdo: 2026-11-04


Quando o `eas submit --platform ios` falha, a mensagem quase sempre diz onde olhar. **Ou a sua configuração do EAS está incompleta, ou a sua conta Apple está bloqueando, ou a Apple recusa o binário.** Os dois primeiros casos se resolvem em poucos minutos, sem build novo. O terceiro se reconhece por um código ITMS, e quase sempre exige um build novo.

Eu publico meus apps iOS, entre eles Solys, TradaZen e Nolera, com Expo e EAS. As mensagens citadas aqui foram copiadas do código-fonte do EAS CLI, no [repositório oficial da Expo no GitHub](https://github.com/expo/eas-cli), revisado em 3 de novembro de 2026. O antigo fórum da Expo agora redireciona para o Discord: o código continua sendo a fonte mais confiável. Para o caminho completo, do arquivo `eas.json` ao envio para revisão, leia primeiro [EAS Submit iOS: publicar um app Expo na App Store](https://devoria.fr/pt-br/blog/eas-submit-ios-publicar-app-expo-app-store). Aqui, a gente conserta.

## O que o eas submit faz, e do que ele precisa

Segundo [a documentação da Expo](https://docs.expo.dev/deploy/submit-to-app-stores/), o comando envia o seu arquivo `.ipa` para o App Store Connect. O build aparece no TestFlight depois do processamento pela Apple, em geral de 10 a 15 minutos. **Ele não envia o seu app para revisão**: esse passo continua sendo feito no App Store Connect.

[A página da Expo sobre o envio para iOS](https://docs.expo.dev/submit/ios/) lista três pré-requisitos:

- **uma conta Apple Developer paga**, exigida para qualquer envio para a App Store;
- **o identificador de bundle** em `ios.bundleIdentifier`;
- **o EAS CLI instalado** e conectado à sua conta Expo.

Para enviar sem interação, a mesma página acrescenta duas configurações:

- **`ascAppId`** no perfil `submit` do `eas.json`, o número da sua ficha no App Store Connect;
- **uma chave de API do App Store Connect**, gerenciada pelo EAS ou fornecida por você. A criação, a função e a revogação dela estão detalhadas em [chave de API do App Store Connect (.p8)](https://devoria.fr/pt-br/blog/chave-api-app-store-connect-p8).

O perfil mínimo cabe em poucas linhas. O valor é fictício:

```json
{
  "submit": {
    "production": {
      "ios": {
        "ascAppId": "1234567890"
      }
    }
  }
}
```

Se o EAS já guarda a sua chave de API, esse perfil basta. É o caso da maioria dos meus apps.

## Ler a mensagem: três famílias de erros

Antes de buscar a correção, identifique o momento em que o comando para. Esta tabela é o roteiro que eu aplico em cada falha.

| Momento da falha                      | Família             | Build novo?  |
| ------------------------------------- | ------------------- | ------------ |
| Antes de qualquer envio               | Configuração do EAS | Não          |
| Conexão com a Apple, criação da ficha | Conta Apple         | Não          |
| Depois do envio, código ITMS-90xxx    | Binário recusado    | Quase sempre |

O detalhe aparece na página do envio, no painel da Expo. [A Expo recomenda](https://docs.expo.dev/deploy/submit-to-app-stores/) ler os logs ali e procurar o balão "Build Annotations", que aponta as causas de falha mais comuns. No terminal, a opção `--verbose` sempre mostra os logs do EAS Submit, segundo [a referência do EAS CLI](https://docs.expo.dev/eas/cli/).

## Os erros de configuração do EAS

### "Set ascAppId in the submit profile (eas.json) or re-run this command in interactive mode."

Você rodou o comando com `--non-interactive`, em integração contínua por exemplo, e o seu perfil não tem `ascAppId`. [O código do EAS CLI](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/src/submit/ios/IosSubmitCommand.ts) então para: ele não consegue te fazer perguntas nem criar a ficha no seu lugar.

**Correção: copie o número da sua ficha em `ascAppId`.** [A Expo mostra onde encontrar](https://github.com/expo/fyi/blob/main/asc-app-id.md): no App Store Connect, abra o seu app e depois App Information. É o campo Apple ID, em General Information, um número de uns dez dígitos. Não é o seu e-mail da Apple nem o seu identificador de bundle.

No Nolera, sem `ascAppId`, o comando me pedia uma sessão Apple Developer, que expira. Desde que o número está no `eas.json`, o envio não pede mais nada.

> Adicione o `ascAppId` antes do build, não depois. Até o SDK 57, [o fingerprint calculado pela Expo](https://github.com/expo/expo/blob/main/packages/@expo/fingerprint/src/sourcer/Expo.ts) sempre inclui o `eas.json`. No Vigie, cuja runtime version segue a política `fingerprint`, adicionar esse número depois de um build mudou o fingerprint: uma atualização publicada depois nunca teria chegado ao build instalado. Desde o SDK 58, o preset padrão do fingerprint, `balanced`, ignora o `eas.json`, segundo [o changelog da Expo](https://github.com/expo/expo/blob/main/packages/@expo/fingerprint/CHANGELOG.md).

### "App Store Connect API Keys cannot be set up in --non-interactive mode."

O seu perfil não tem chave, e o EAS não tem nenhuma vinculada ao seu app. [A Expo explica](https://docs.expo.dev/submit/ios/): no modo não interativo, o comando não pode te pedir uma chave, e falha com essa mensagem.

Duas correções possíveis:

- **Deixe o EAS criar e guardar a chave.** Rode uma vez `eas credentials --platform ios` no modo interativo, na sua máquina, e deixe ele configurar uma chave de API do App Store Connect para o seu app.
- **Traga a sua própria chave** em `ascApiKeyPath`, `ascApiKeyIssuerId` e `ascApiKeyId`. Segundo [a referência do eas.json](https://docs.expo.dev/eas/json/), esses três campos aceitam variáveis de ambiente, como `$ASC_API_KEY_PATH`.

No meu último app, a opção `--auto-submit` queria um login da Apple para criar a chave de envio. Coloquei os três campos da minha própria chave no perfil da minha cópia de trabalho, nunca commitada. Depois enviei o build pronto com `--id` e `--non-interactive`.

### "EXPO_APPLE_APP_SPECIFIC_PASSWORD must be in the format xxxx-xxxx-xxxx-xxxx, where x is a lowercase letter."

A variável contém outra coisa que não uma senha de app, muitas vezes a sua própria senha da Apple. O [EAS CLI](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/src/submit/ios/IosSubmitCommand.ts) verifica esse formato antes de qualquer envio.

Segundo [a ajuda da Apple](https://support.apple.com/en-us/102654), uma senha de app é gerada em account.apple.com, na seção App-Specific Passwords, com a autenticação de dois fatores ativada. Ela é revogada assim que você muda a senha da sua conta Apple. **A Expo considera esse método [menos seguro que a chave de API](https://github.com/expo/fyi/blob/main/apple-app-specific-password.md), que é o método padrão e recomendado por ela.**

## Os erros da conta Apple

### "… agree to the latest Program License Agreement in your developer account."

A mensagem completa começa com "You currently don't have access to this membership resource". Do lado da Apple, a resposta bruta pode conter "Unable to process request - PLA Update available". As etapas de envio mais recentes do EAS mostram em vez disso "A required Apple agreement is missing or has expired".

A causa é a mesma: a Apple atualizou um contrato, e ninguém aceitou. **Só o titular da conta, o Account Holder, pode aceitar os contratos**, segundo [a tabela de funções da Apple](https://developer.apple.com/help/account/access/roles/). [O código do EAS](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/utils/ios/AscApiClient.ts) pede que ele passe pela página Business do App Store Connect e, se a Apple oferecer, pela conta dele em developer.apple.com. Depois rode o comando de novo. O contrato dos apps pagos tem o próprio guia: Paid Apps Agreement no App Store Connect.

### "App Store Connect rejected the API authentication credentials."

A Apple respondeu com um erro 401, `NOT_AUTHORIZED`. O [EAS](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/utils/ios/AscApiClient.ts) cita três causas: uma chave que não está mais ativa, uma chave de outra conta do App Store Connect, ou um Key ID, um conteúdo de chave ou um Issuer ID errado.

Confira os dois identificadores no App Store Connect, menu Users and Access, aba Integrations. Segundo a [Apple](https://developer.apple.com/documentation/appstoreconnectapi/generating-tokens-for-api-requests), o Issuer ID aparece no topo da página, e o Key ID na lista de chaves ativas. **Uma chave revogada nunca é reativada.** A [Apple mostra a chave](https://developer.apple.com/documentation/appstoreconnectapi/revoking-api-keys) por 30 dias em Revoked: é preciso gerar uma nova.

### "App Store Connect app for application identifier … was not found."

A ficha apontada pelo `ascAppId` não é encontrada com a sua chave. O [EAS](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/utils/ios/AscApiUtils.ts) pede que você confira esse número e se a chave tem mesmo acesso ao app na conta certa. Ele até lista alguns apps visíveis com essa chave. Com as ferramentas de envio da Apple, o mesmo problema aparece como "No suitable application records were found".

Três causas se repetem, duas delas apontadas [nesta thread dos fóruns da Apple](https://developer.apple.com/forums/thread/106806):

- **A ficha não existe.** Crie no App Store Connect, ou remova o `ascAppId` para o comando criar.
- **O número vem de outra conta.** Você copiou o `ascAppId` de outro time, ou de outro projeto.
- **O usuário não tem acesso ao app.** Um App Manager ou um Developer pode estar limitado a certos apps. Já uma chave de time [acessa todos os apps](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api) da conta.

### "… is not available to team" ou "… is not available to provider"

Essa mensagem aparece quando o EAS cria a ficha por você, na falta de `ascAppId`. O identificador de bundle já está sendo usado por outro time. O [EAS pede](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/src/credentials/ios/appstore/ensureAppExists.ts) que você mude ele na configuração do seu app e rode de novo.

### "App name "…" is already taken. Using generated name "…""

Isso não é uma falha. Quando o nome já está em uso na App Store, o EAS acrescenta seis caracteres aleatórios e tenta de novo, até cinco vezes. Você renomeia a ficha depois no App Store Connect. Para evitar, preencha `appName` e `language` no perfil antes do primeiro envio: sem `language`, [o idioma principal fica `en-US`](https://docs.expo.dev/eas/json/).

## Os erros do binário: os códigos ITMS

Depois do envio, a Apple processa o build. Se recusar, o log cita um ou mais códigos ITMS. Estes são os que [a etapa de envio do EAS](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/functions/uploadToAsc.ts) reconhece e traduz:

| Código ITMS                | O que a Apple recusa                                 | Correção               |
| -------------------------- | ---------------------------------------------------- | ---------------------- |
| 90189                      | Número de build já usado                             | `autoIncrement`        |
| 90062, 90186, 90478        | Versão fechada ou já ultrapassada                    | Subir a `version`      |
| 90683                      | Frase de permissão ausente                           | `ios.infoPlist`        |
| 90725                      | SDK do iOS antigo demais                             | Imagem iOS ou SDK Expo |
| 90054, 90055               | Bundle diferente da ficha apontada                   | Corrigir o `ascAppId`  |
| 90022, 90023, 90391, 90713 | Ícones ausentes ou mal declarados                    | Revisar os ícones      |
| 90771                      | Identificadores de tarefas em segundo plano ausentes | `ios.infoPlist`        |

Três observações tiradas dessas mensagens:

- **O número de build é único por versão.** Para o 90189, o EAS recomenda `"autoIncrement": true` no `eas.json`. Está tudo em número de build e versão.
- **Para o 90725**, o EAS recomenda escolher uma imagem iOS mais recente no `eas.json` e, se precisar, migrar para um SDK da Expo com suporte.
- **Para o 90771**, o seu Info.plist declara o modo de segundo plano `processing`, mas não a chave `BGTaskSchedulerPermittedIdentifiers`.

Tirando o 90054 e o 90055, em que basta apontar para a ficha certa ou para outro build, **a correção mexe no binário: faça um build novo e envie de novo.** Dois códigos têm guia próprio: [ITMS-90683 com Expo](https://devoria.fr/pt-br/blog/itms-90683-missing-purpose-string-expo) e ITMS-90725.

No fim de setembro de 2026, um build do Solys foi recusado na entrega por ITMS-90683. Eu tinha removido uma frase de permissão sobre fotos durante uma faxina no arquivo de configuração. O Solys não usa fotos, mas uma biblioteca do projeto chama a API Photos do iOS. **A Apple analisa o binário, não o uso real:** desde então, nunca mais removo essas frases.

Já o status Missing Compliance não é um erro de envio. Falta a sua declaração sobre criptografia, explicada no [guia de publicação com EAS](https://devoria.fr/pt-br/blog/eas-submit-ios-publicar-app-expo-app-store).

## Minha checklist antes de cada envio

- O `ascAppId` está no perfil `submit`, adicionado antes do build.
- A chave de API é gerenciada pelo EAS, ou os três campos dela apontam para um `.p8` guardado fora do repositório.
- O Account Holder aceitou os contratos mais recentes no App Store Connect.
- O `autoIncrement` está ativo, com `"appVersionSource": "remote"`, [recomendado pela Expo](https://docs.expo.dev/build-reference/app-versions/) desde o EAS CLI 12.
- A `version` é maior que a última versão aprovada.
- Cada API sensível presente no binário tem a sua frase de permissão.
- Para um app novo, `appName` e `language` estão preenchidos antes do primeiro envio.

## Enviar o seu primeiro app sem travar

O comando é só uma etapa. O [iOS & Android Kit](https://devoria.fr/pt-br/kits/ios) 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 o seu primeiro lançamento, [faça o seu diagnóstico gratuito](https://devoria.fr/pt-br/diagnostic): ele mostra o que realmente está te travando e te envia a minha checklist antirrejeição da Apple. Para a ficha, as capturas de tela e a aprovação, a página [publicar um aplicativo na App Store](https://devoria.fr/pt-br/expertise/publicar-app-na-app-store) retoma cada etapa.

## Perguntas frequentes

### Por que o eas submit falha só na integração contínua?

No modo `--non-interactive`, o comando não pode te perguntar nada. Ele precisa do `ascAppId` no perfil e de uma chave de API já vinculada ao app, ou dos três campos dela no `eas.json`. Na sua máquina, ele teria feito essas perguntas.

### Preciso fazer um build novo depois de um erro do eas submit?

Só se a Apple recusar o binário, com um código ITMS. Exceção: no ITMS-90054 e no 90055, o build apontava para a ficha errada, basta reenviar para a certa. Os erros de configuração e de conta se corrigem no `eas.json`, no App Store Connect ou na sua conta Apple. Depois você reenvia o mesmo build, por exemplo com `--latest` ou `--id`.

### Onde ver os logs de um envio do EAS Submit?

Na página do envio, no painel da Expo. A Expo recomenda ler ali os logs e o balão "Build Annotations". No terminal, adicione `--verbose` para sempre mostrar os logs.

### Dá para usar o eas submit com uma conta Apple gratuita?

Não. A Expo exige uma conta Apple Developer paga para enviar um app para a App Store. A conta gratuita permite testar no seu próprio iPhone, não usar o App Store Connect.

### Qual função dar à chave de API para o eas submit?

O guia da Expo dá a função Admin à chave. Segundo a tabela de funções da Apple, o envio de builds também está liberado para as funções App Manager e Developer. Meus builds Expo rodam com uma chave de time com a função App Manager. Só o Account Holder e os Admins podem gerar uma chave de time.

### O que significa "Increment Build Number" no EAS?

A Apple recusou o build com o código ITMS-90189: esse número de build já existe para essa versão. Ative `"autoIncrement": true` no `eas.json`, ou suba o `ios.buildNumber`, e faça um build novo.


## Seu projeto

[Review Kit](https://devoria.fr/pt-br/kits/app-review): Meu checklist de revisão da App Store, as recusas da Apple que corrigi, o checklist do Google Play e três skills do Claude Code. R$ 289.

[iOS & Android Kit](https://devoria.fr/pt-br/kits/ios): Crie seu app para iPhone e Android com o Claude Code: o código inicial dos meus apps, o caminho até as lojas e todos os kits. R$ 589.

[Diagnóstico: o que te separa do seu app de iPhone](https://devoria.fr/pt-br/diagnostic): 7 perguntas, 60 segundos: descubra o que realmente te impede de publicar seu app de iPhone, seu caminho em 4 etapas e o kit certo para você.
