# EAS Submit iOS: publicar app Expo na App Store

> 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.

Página original: [EAS Submit iOS: publicar app Expo na App Store](https://devoria.fr/pt-br/blog/eas-submit-ios-publicar-app-expo-app-store)
Autor: [Mehdi Azizi](https://devoria.fr/pt-br/mehdi-azizi)
Publicação: 2026-10-25
Última revisão do conteúdo: 2026-10-25


`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](https://docs.expo.dev/submit/ios/), revisada em 25 de outubro de 2026. Sem Mac, o caminho completo está em [publicar um app iOS sem Mac](https://devoria.fr/pt-br/blog/publicar-app-ios-sem-mac-expo-eas). 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](https://devoria.fr/pt-br/blog/conta-desenvolvedor-apple-preco).
- **Um identificador de bundle** em `ios.bundleIdentifier`. Segundo [a referência da configuração do Expo](https://docs.expo.dev/versions/latest/config/app/), você mesmo o inventa, mas ele precisa ser único na App Store.
- **EAS CLI instalado**, e depois `eas login` com 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](https://developer.apple.com/help/app-store-connect/create-an-app-record/add-a-new-app) 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](https://docs.expo.dev/submit/testflight/), o `eas submit` cria o registro quando você envia seu primeiro build. Segundo [a referência do eas.json](https://docs.expo.dev/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](https://developer.apple.com/support/authentication/) 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](https://github.com/expo/fyi/blob/main/apple-app-specific-password.md) 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 perfil `production`, 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](https://github.com/expo/fyi/blob/main/creating-asc-api-key.md) 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](https://developer.apple.com/documentation/appstoreconnectapi/generating-tokens-for-api-requests). E guarde bem o arquivo `.p8`: [você só pode baixá-lo uma vez](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api), 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.

```json
{
  "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"
      }
    }
  }
}
```

- **`appVersionSource` e `autoIncrement`**: 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](https://docs.expo.dev/build-reference/app-versions/) 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 pasta `keys` ao 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

```bash
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](https://docs.expo.dev/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](https://docs.expo.dev/build/automate-submissions/), 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](https://developer.apple.com/help/app-store-connect/manage-builds/upload-builds) 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`:

```json
{
  "expo": {
    "ios": {
      "config": {
        "usesNonExemptEncryption": false
      }
    }
  }
}
```

Segundo a [Apple](https://developer.apple.com/documentation/security/complying-with-encryption-export-regulations), `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](https://developer.apple.com/help/app-store-connect/reference/app-build-statuses), 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](https://devoria.fr/pt-br/blog/testflight-como-testar-app-iphone-antes-envio).

## O envio não é a submissão para revisão

[O Expo deixa claro](https://docs.expo.dev/submit/introduction/): 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](https://developer.apple.com/help/app-store-connect/manage-submissions-to-app-review/submit-an-app):

1. **Preencha os metadados obrigatórios** da versão.
2. **Escolha o build** na seção Build da versão.
3. **Clique em "Add for Review".** A versão passa para Ready for Review, mas nada foi enviado para revisão ainda.
4. **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](https://devoria.fr/pt-br/blog/itms-90683-missing-purpose-string-expo), [ITMS-91053 com Expo](https://devoria.fr/pt-br/blog/itms-91053-missing-api-declaration-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](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 seu primeiro lançamento, [faça seu diagnóstico gratuito](https://devoria.fr/pt-br/diagnostic): 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](https://devoria.fr/pt-br/expertise/publicar-app-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.


## Seu projeto

[Apple Review Kit](https://devoria.fr/pt-br/kits/review-apple): A checklist de review da App Store que eu uso, minhas rejeições da Apple corrigidas, as notas para o revisor e duas skills do Claude Code que revisam seu app. 29 €.

[iOS Kit](https://devoria.fr/pt-br/kits/ios): Crie seu app de iPhone com Claude Code: o código inicial dos meus apps, as skills que verificam o trabalho dele e os kits Apple Review, App Store Screenshots e ASO. 129,99 €.
