eas submit iOS: errors freqüents i com corregir-los
Per Mehdi Azizi
Publicat el , 10 min
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.
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, 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. Aquí, reparem.
Què fa eas submit, i què necessita
Segons la documentació d'Expo, 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 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:
ascAppIdal perfilsubmitd'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).
El perfil mínim cap en poques línies. El valor és inventat:
{
"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 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.
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 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: 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
ascAppIdabans del build, no després. Fins a l'SDK 57, l'empremta calculada per Expo sempre incloueas.json. A Vigie, on la versió d'execució segueix la políticafingerprint, 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, ignoraeas.json, segons el registre de canvis d'Expo.
"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: 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 iosen 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,ascApiKeyIssuerIdiascApiKeyId. Segons la referència d'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 comprova aquest format abans de qualsevol enviament.
Segons l'ajuda d'Apple, 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, 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. El codi d'EAS 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.
"App Store Connect rejected the API authentication credentials."
Apple ha respost amb un error 401, NOT_AUTHORIZED. EAS 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, 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 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 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:
- La fitxa no existeix. Crea-la a App Store Connect, o treu
ascAppIdperquè l'ordre la creï. - El número és d'un altre compte. Has copiat l'
ascAppIdd'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 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 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.
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 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": trueaeas.json. Ho tens tot a número de build i versió. - Per a 90725, EAS recomana triar una imatge iOS més recent a
eas.jsoni, 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 clauBGTaskSchedulerPermittedIdentifiers.
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 i ITMS-90725.
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.
La meva checklist abans de cada enviament
ascAppIdés al perfilsubmit, afegit abans del build.- La clau API la gestiona EAS, o els seus tres camps apunten a un
.p8guardat fora del repositori. - L'Account Holder ha acceptat els últims contractes a App Store Connect.
autoIncrementestà actiu, amb"appVersionSource": "remote", recomanat per Expo 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,
appNameilanguageestan 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 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: 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 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.

