# eas submit iOS: errors freqüents i com corregir-los

> eas submit falla? Els missatges reals d'EAS i d'App Store Connect, la causa i la solució: ascAppId, clau API, contracte d'Apple, codis ITMS.

Pàgina original: [eas submit iOS: errors freqüents i com corregir-los](https://devoria.fr/ca/blog/eas-submit-ios-errors-frequents-correccio)
Autor: [Mehdi Azizi](https://devoria.fr/ca/mehdi-azizi)
Publicació: 2026-11-04
Darrera revisió del contingut: 2026-11-04


Quan `eas submit --platform ios` falla, el missatge gairebé sempre et diu on mirar. **O la teva configuració d'EAS està incompleta, o el teu compte d'Apple bloqueja, o Apple rebutja el binari.** Els dos primers casos es corregeixen en pocs minuts, sense fer un build nou. El tercer es reconeix per un codi ITMS, i gairebé sempre demana un build nou.

Publico les meves apps iOS, entre elles Solys, TradaZen i Nolera, amb Expo i EAS. Els missatges citats aquí estan copiats del codi font d'EAS CLI, a [el repositori oficial d'Expo a GitHub](https://github.com/expo/eas-cli), revisat el 3 de novembre de 2026. L'antic fòrum d'Expo ara redirigeix a Discord: el codi continua sent la font més fiable. Per al recorregut complet, del fitxer `eas.json` fins a l'enviament a revisió, llegeix primer [EAS Submit iOS: publicar una app Expo a l'App Store](https://devoria.fr/ca/blog/eas-submit-ios-publicar-app-expo-app-store). Aquí, reparem.

## Què fa eas submit, i què necessita

Segons [la documentació d'Expo](https://docs.expo.dev/deploy/submit-to-app-stores/), l'ordre envia el teu fitxer `.ipa` a App Store Connect. El build apareix a TestFlight després que Apple el processi, normalment entre 10 i 15 minuts. **No envia la teva app a revisió**: això ho has de fer tu a App Store Connect.

[La pàgina d'Expo sobre l'enviament a iOS](https://docs.expo.dev/submit/ios/) llista tres requisits:

- **un compte d'Apple Developer de pagament**, obligatori per a qualsevol enviament a l'App Store;
- **l'identificador de bundle** a `ios.bundleIdentifier`;
- **EAS CLI instal·lat** i connectat al teu compte d'Expo.

Per enviar sense interacció, la mateixa pàgina hi afegeix dos ajustos:

- **`ascAppId`** al perfil `submit` d'`eas.json`, el número de la teva fitxa d'App Store Connect;
- **una clau API d'App Store Connect**, gestionada per EAS o aportada per tu. La creació, el rol i la revocació estan detallats a [clau API d'App Store Connect (.p8)](https://devoria.fr/ca/blog/clau-api-app-store-connect-p8).

El perfil mínim cap en poques línies. El valor és inventat:

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

Si EAS ja guarda la teva clau API, aquest perfil n'hi ha prou. És el cas de la majoria de les meves apps.

## Llegir el missatge: tres famílies d'errors

Abans de buscar la solució, localitza el moment en què l'ordre s'atura. Aquesta taula és la graella que aplico a cada error.

| Moment de l'error                       | Família            | Build nou?     |
| --------------------------------------- | ------------------ | -------------- |
| Abans de qualsevol enviament            | Configuració d'EAS | No             |
| Connexió amb Apple, creació de la fitxa | Compte d'Apple     | No             |
| Després de l'enviament, codi ITMS-90xxx | Binari rebutjat    | Gairebé sempre |

El detall es llegeix a la pàgina de l'enviament, al tauler d'Expo. [Expo recomana](https://docs.expo.dev/deploy/submit-to-app-stores/) llegir-hi els registres i buscar la bombolla "Build Annotations", que assenyala les causes d'error habituals. Al terminal, l'opció `--verbose` mostra sempre els registres d'EAS Submit, segons [la referència d'EAS CLI](https://docs.expo.dev/eas/cli/).

## Els errors de configuració d'EAS

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

Has llançat l'ordre amb `--non-interactive`, en integració contínua per exemple, i el teu perfil no conté `ascAppId`. [El codi d'EAS CLI](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/src/submit/ios/IosSubmitCommand.ts) s'atura: no et pot fer cap pregunta ni crear la fitxa per tu.

**Solució: copia el número de la teva fitxa a `ascAppId`.** [Expo indica on trobar-lo](https://github.com/expo/fyi/blob/main/asc-app-id.md): a App Store Connect, obre la teva app i després App Information. És el camp Apple ID, a General Information, un número d'una desena de xifres. No és ni la teva adreça de correu d'Apple ni el teu identificador de bundle.

A Nolera, sense `ascAppId`, l'ordre em demanava una sessió d'Apple Developer, que caduca. Des que el número és a `eas.json`, l'enviament ja no em demana res.

> Afegeix `ascAppId` abans del build, no després. Fins a l'SDK 57, [l'empremta calculada per Expo](https://github.com/expo/expo/blob/main/packages/@expo/fingerprint/src/sourcer/Expo.ts) sempre inclou `eas.json`. A Vigie, on la versió d'execució segueix la política `fingerprint`, afegir aquest número després d'un build va canviar l'empremta: una actualització publicada després no hauria arribat mai al build instal·lat. Des de l'SDK 58, el preajust per defecte de l'empremta, `balanced`, ignora `eas.json`, segons [el registre de canvis d'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."

El teu perfil no conté cap clau, i EAS no en té cap de vinculada a la teva app. [Expo ho especifica](https://docs.expo.dev/submit/ios/): en mode no interactiu, l'ordre no et pot demanar cap clau, i falla amb aquest missatge.

Dues solucions possibles:

- **Deixa que EAS creï i guardi la clau.** Llança una vegada `eas credentials --platform ios` en mode interactiu, a la teva màquina, i deixa que configuri una clau API d'App Store Connect per a la teva app.
- **Aporta la teva pròpia clau** a `ascApiKeyPath`, `ascApiKeyIssuerId` i `ascApiKeyId`. Segons [la referència d'eas.json](https://docs.expo.dev/eas/json/), aquests tres camps accepten variables d'entorn, com ara `$ASC_API_KEY_PATH`.

A la meva última app, l'opció `--auto-submit` volia un identificador d'Apple per crear la seva clau d'enviament. Vaig posar els tres camps de la meva pròpia clau al perfil de la meva còpia de treball, mai pujada amb commit. Després vaig enviar el build acabat amb `--id` i `--non-interactive`.

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

La variable conté una altra cosa que no és una contrasenya d'app, sovint la teva pròpia contrasenya d'Apple. [EAS CLI](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/src/submit/ios/IosSubmitCommand.ts) comprova aquest format abans de qualsevol enviament.

Segons [l'ajuda d'Apple](https://support.apple.com/en-us/102654), una contrasenya d'app es genera a account.apple.com, apartat App-Specific Passwords, amb l'autenticació de doble factor activada. Es revoca tan bon punt canvies la contrasenya del teu compte d'Apple. **Expo considera aquest mètode [menys segur que la clau API](https://github.com/expo/fyi/blob/main/apple-app-specific-password.md), el seu mètode per defecte i recomanat.**

## Els errors del compte d'Apple

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

El missatge complet comença per "You currently don't have access to this membership resource". Per part d'Apple, la resposta en brut pot contenir "Unable to process request - PLA Update available". Els passos d'enviament recents d'EAS mostren més aviat "A required Apple agreement is missing or has expired".

La causa és la mateixa: Apple ha actualitzat un contracte i ningú l'ha acceptat. **Només el titular del compte, l'Account Holder, pot acceptar els contractes**, segons [la taula de rols d'Apple](https://developer.apple.com/help/account/access/roles/). [El codi d'EAS](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/utils/ios/AscApiClient.ts) li demana que passi per la pàgina Business d'App Store Connect i després, si Apple ho proposa, pel seu compte a developer.apple.com. Després torna a llançar l'ordre. El contracte de les apps de pagament té la seva guia: [Paid Apps Agreement a App Store Connect](https://devoria.fr/ca/blog/paid-apps-agreement-estats-w-8ben-primer-pagament).

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

Apple ha respost amb un error 401, `NOT_AUTHORIZED`. [EAS](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/utils/ios/AscApiClient.ts) cita tres causes: una clau que ja no està activa, una clau d'un altre compte d'App Store Connect, o un Key ID, un contingut de clau o un Issuer ID erronis.

Comprova els dos identificadors a App Store Connect, menú Users and Access, pestanya Integrations. Segons [Apple](https://developer.apple.com/documentation/appstoreconnectapi/generating-tokens-for-api-requests), l'Issuer ID apareix a dalt de la pàgina, i el Key ID a la llista de claus actives. **Una clau revocada no es reactiva mai.** [Apple la mostra](https://developer.apple.com/documentation/appstoreconnectapi/revoking-api-keys) 30 dies a Revoked: n'has de generar una de nova.

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

La fitxa indicada per `ascAppId` no es troba amb la teva clau. [EAS](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/utils/ios/AscApiUtils.ts) et demana que comprovis aquest número i que la clau tingui accés a l'app al compte correcte. Fins i tot llista algunes apps visibles amb aquesta clau. Amb les eines d'enviament d'Apple, el mateix problema apareix com a "No suitable application records were found".

Hi ha tres causes habituals, dues de les quals recollides a [aquest fil dels fòrums d'Apple](https://developer.apple.com/forums/thread/106806):

- **La fitxa no existeix.** Crea-la a App Store Connect, o treu `ascAppId` perquè l'ordre la creï.
- **El número és d'un altre compte.** Has copiat l'`ascAppId` d'un altre equip, o d'un altre projecte.
- **L'usuari no té accés a l'app.** Un App Manager o un Developer pot estar limitat a certes apps. Una clau d'equip, en canvi, [té accés a totes les apps](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api) del compte.

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

Aquest missatge apareix quan EAS crea la fitxa per tu, a falta d'`ascAppId`. L'identificador de bundle ja el fa servir un altre equip. [EAS et demana](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/src/credentials/ios/appstore/ensureAppExists.ts) que el canviïs a la configuració de la teva app i que tornis a llançar l'ordre.

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

No és un error. Quan el nom ja està agafat a l'App Store, EAS hi afegeix sis caràcters a l'atzar i ho torna a provar, fins a cinc vegades. Ja canviaràs el nom de la fitxa més endavant a App Store Connect. Per evitar-ho, omple `appName` i `language` al perfil abans del primer enviament: sense `language`, [l'idioma principal és `en-US`](https://docs.expo.dev/eas/json/).

## Els errors del binari: els codis ITMS

Després de l'enviament, Apple processa el build. Si el rebutja, el registre cita un o diversos codis ITMS. Aquests són els que [el pas d'enviament d'EAS](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/functions/uploadToAsc.ts) reconeix i tradueix:

| Codi ITMS                  | Què rebutja Apple                        | Solució               |
| -------------------------- | ---------------------------------------- | --------------------- |
| 90189                      | Número de build ja utilitzat             | `autoIncrement`       |
| 90062, 90186, 90478        | Versió tancada o ja superada             | Pujar `version`       |
| 90683                      | Falta la frase d'autorització            | `ios.infoPlist`       |
| 90725                      | SDK d'iOS massa antic                    | Imatge iOS o SDK Expo |
| 90054, 90055               | Bundle diferent de la fitxa indicada     | Corregir `ascAppId`   |
| 90022, 90023, 90391, 90713 | Icones absents o mal declarades          | Revisar les icones    |
| 90771                      | Falten identificadors de tasques de fons | `ios.infoPlist`       |

Tres aclariments extrets d'aquests missatges:

- **El número de build és únic per versió.** Per a 90189, EAS recomana `"autoIncrement": true` a `eas.json`. Ho tens tot a [número de build i versió](https://devoria.fr/ca/blog/app-store-connect-build-number-versio-numero-build).
- **Per a 90725**, EAS recomana triar una imatge iOS més recent a `eas.json` i, si cal, passar a un SDK d'Expo compatible.
- **Per a 90771**, el teu Info.plist declara el mode en segon pla `processing`, però no la clau `BGTaskSchedulerPermittedIdentifiers`.

Excepte per a 90054 i 90055, on n'hi ha prou d'apuntar a la fitxa correcta o a un altre build, **la solució afecta el binari: torna a fer un build i torna a enviar-lo.** Dos codis tenen la seva guia: [ITMS-90683 amb Expo](https://devoria.fr/ca/blog/itms-90683-missing-purpose-string-expo) i [ITMS-90725](https://devoria.fr/ca/blog/itms-90725-sdk-version-issue-expo).

A finals de setembre de 2026, un build de Solys va ser rebutjat en el lliurament per ITMS-90683. Havia tret una frase d'autorització sobre les fotos mentre feia neteja del fitxer de configuració. Solys no fa servir les fotos, però una llibreria del projecte crida l'API Photos d'iOS. **Apple analitza el binari, no l'ús real:** des de llavors, no trec mai aquestes frases.

L'estat Missing Compliance, en canvi, no és un error d'enviament. Hi falta la teva declaració sobre el xifratge, explicada a [la guia de publicació amb EAS](https://devoria.fr/ca/blog/eas-submit-ios-publicar-app-expo-app-store).

## La meva checklist abans de cada enviament

- `ascAppId` és al perfil `submit`, afegit abans del build.
- La clau API la gestiona EAS, o els seus tres camps apunten a un `.p8` guardat fora del repositori.
- L'Account Holder ha acceptat els últims contractes a App Store Connect.
- `autoIncrement` està actiu, amb `"appVersionSource": "remote"`, [recomanat per Expo](https://docs.expo.dev/build-reference/app-versions/) des d'EAS CLI 12.
- La `version` és superior a l'última versió aprovada.
- Cada API sensible present al binari té la seva frase d'autorització.
- Per a una app nova, `appName` i `language` estan omplerts abans del primer enviament.

## Enviar la teva primera app sense quedar-te encallat

L'ordre és només un pas. L'[iOS & Android Kit](https://devoria.fr/ca/kits/ios) parteix del codi base de les meves apps, subscripcions incloses, i segueix quatre etapes fins a l'App Store, al teu ritme.

Si prepares el teu primer llançament, [fes el teu diagnòstic gratuït](https://devoria.fr/ca/diagnostic): et diu què és el que realment t'encalla i t'envia la meva checklist antirebuig d'Apple. Per a la fitxa, les captures i la validació, la pàgina [publicar una aplicació a l'App Store](https://devoria.fr/ca/expertise/publicar-una-aplicacio-app-store) repassa cada etapa.

## Preguntes freqüents

### Per què eas submit només falla en integració contínua?

En mode `--non-interactive`, l'ordre no et pot preguntar res. Necessita `ascAppId` al perfil i una clau API ja vinculada a l'app, o els seus tres camps a `eas.json`. A la teva màquina, t'hauria fet aquestes preguntes.

### Cal tornar a fer un build després d'un error d'eas submit?

Només si Apple rebutja el binari, amb un codi ITMS. Excepció: per a ITMS-90054 i 90055, el build apuntava a la fitxa equivocada, i n'hi ha prou de tornar-lo a enviar a la correcta. Els errors de configuració i de compte es corregeixen a `eas.json`, a App Store Connect o al teu compte d'Apple. Després tornes a enviar el mateix build, per exemple amb `--latest` o `--id`.

### On puc veure els registres d'un enviament d'EAS Submit?

A la pàgina de l'enviament, al tauler d'Expo. Expo recomana llegir-hi els registres i la bombolla "Build Annotations". Al terminal, afegeix `--verbose` per mostrar sempre els registres.

### Es pot fer servir eas submit amb un compte d'Apple gratuït?

No. Expo exigeix un compte d'Apple Developer de pagament per enviar una app a l'App Store. El compte gratuït et permet provar al teu propi iPhone, però no fer servir App Store Connect.

### Quin rol cal donar a la clau API per a eas submit?

La guia d'Expo dona el rol Admin a la clau. Segons la taula de rols d'Apple, l'enviament de builds també està obert als rols App Manager i Developer. Els meus builds d'Expo funcionen amb una clau d'equip amb el rol App Manager. Només l'Account Holder i els Admins poden generar una clau d'equip.

### Què vol dir "Increment Build Number" a EAS?

Apple ha rebutjat el build amb el codi ITMS-90189: aquest número de build ja existeix per a aquesta versió. Activa `"autoIncrement": true` a `eas.json`, o puja `ios.buildNumber`, i torna a fer un build.


## El teu projecte

[Review Kit](https://devoria.fr/ca/kits/app-review): La meva checklist de revisió de l'App Store, els rebutjos d'Apple que he corregit, la de Google Play i tres skills de Claude Code. 49 €.

[iOS & Android Kit](https://devoria.fr/ca/kits/ios): Crea la teva app d'iPhone i Android amb Claude Code: el codi de partida de les meves apps, el camí fins a les botigues i tots els kits. 99 €.

[Diagnòstic: què et separa de la teva app d'iPhone](https://devoria.fr/ca/diagnostic): 7 preguntes, 60 segons: sabràs què et bloqueja de debò per publicar la teva app d'iPhone, el teu recorregut en 4 etapes i el kit que et toca.
