eas submit iOS: errori comuni e come risolverli
Di Mehdi Azizi
Pubblicato il , 10 min
eas submit fallisce? I veri messaggi di EAS e App Store Connect, la causa e la soluzione: ascAppId, chiave API, contratto Apple, codici ITMS.
Quando eas submit --platform ios fallisce, il messaggio ti dice quasi sempre dove guardare. O la tua configurazione EAS è incompleta, o il tuo account Apple blocca qualcosa, o Apple rifiuta il binario. I primi due casi si risolvono in pochi minuti, senza un nuovo build. Il terzo si riconosce da un codice ITMS, e richiede quasi sempre un nuovo build.
Pubblico le mie app iOS, tra cui Solys, TradaZen e Nolera, con Expo ed EAS. I messaggi citati qui sono copiati dal codice sorgente di EAS CLI, su il repository GitHub ufficiale di Expo, riletto il 3 novembre 2026. Il vecchio forum di Expo ora rimanda a Discord: il codice resta la fonte più affidabile. Per il percorso completo, dal file eas.json all'invio in revisione, leggi prima EAS Submit iOS: pubblicare un'app Expo sull'App Store. Qui si ripara.
Cosa fa eas submit, e cosa gli serve
Secondo la documentazione di Expo, il comando invia il tuo file .ipa ad App Store Connect. Il build compare in TestFlight dopo l'elaborazione da parte di Apple, di solito in 10-15 minuti. Non invia la tua app in revisione: quel passaggio lo devi fare tu in App Store Connect.
La pagina di Expo sull'invio iOS elenca tre prerequisiti:
- un account Apple Developer a pagamento, obbligatorio per qualsiasi invio all'App Store;
- il bundle identifier in
ios.bundleIdentifier; - EAS CLI installato e collegato al tuo account Expo.
Per inviare senza interazione, la stessa pagina aggiunge due impostazioni:
ascAppIdnel profilosubmitdieas.json, il numero della tua scheda App Store Connect;- una chiave API App Store Connect, gestita da EAS o fornita da te. Creazione, ruolo e revoca sono spiegati in chiave API App Store Connect (.p8).
Il profilo minimo sta in poche righe. Il valore è fittizio:
{
"submit": {
"production": {
"ios": {
"ascAppId": "1234567890"
}
}
}
}
Se EAS conserva già la tua chiave API, questo profilo basta. È il caso della maggior parte delle mie app.
Leggere il messaggio: tre famiglie di errori
Prima di cercare la soluzione, individua il momento in cui il comando si ferma. Questa tabella è la griglia che applico a ogni fallimento.
| Momento del fallimento | Famiglia | Nuovo build? |
|---|---|---|
| Prima di qualsiasi invio | Configurazione EAS | No |
| Connessione ad Apple, creazione scheda | Account Apple | No |
| Dopo l'invio, codice ITMS-90xxx | Binario rifiutato | Quasi sempre |
I dettagli si leggono nella pagina dell'invio, nella dashboard di Expo. Expo consiglia di leggere lì i log e di cercare il riquadro "Build Annotations", che segnala le cause di fallimento più comuni. Nel terminale, l'opzione --verbose mostra sempre i log di EAS Submit, secondo la reference di EAS CLI.
Gli errori di configurazione EAS
"Set ascAppId in the submit profile (eas.json) or re-run this command in interactive mode."
Hai lanciato il comando con --non-interactive, in integrazione continua per esempio, e il tuo profilo non contiene ascAppId. Il codice di EAS CLI allora si ferma: non può farti domande, né creare la scheda al posto tuo.
Soluzione: copia il numero della tua scheda in ascAppId. Expo spiega dove trovarlo: in App Store Connect, apri la tua app, poi App Information. È il campo Apple ID, sotto General Information, un numero di una decina di cifre. Non è la tua email Apple, né il tuo bundle identifier.
Su Nolera, senza ascAppId, il comando mi chiedeva una sessione Apple Developer, che scade. Da quando il numero è in eas.json, l'invio non chiede più niente.
Aggiungi
ascAppIdprima del build, non dopo. Fino all'SDK 57, l'impronta calcolata da Expo include sempreeas.json. Su Vigie, la cui runtime version segue la policyfingerprint, aggiungere questo numero dopo un build ha cambiato l'impronta: un aggiornamento pubblicato dopo non avrebbe mai raggiunto il build installato. Dall'SDK 58, il preset predefinito dell'impronta,balanced, ignoraeas.json, secondo il changelog di Expo.
"App Store Connect API Keys cannot be set up in --non-interactive mode."
Il tuo profilo non contiene una chiave, ed EAS non ne ha nessuna collegata alla tua app. Expo lo precisa: in modalità non interattiva, il comando non può chiederti una chiave, e fallisce con questo messaggio.
Due soluzioni possibili:
- Lascia che EAS crei e conservi la chiave. Lancia una volta
eas credentials --platform iosin modalità interattiva, sul tuo computer, e lascialo configurare una chiave API App Store Connect per la tua app. - Usa la tua chiave in
ascApiKeyPath,ascApiKeyIssuerIdeascApiKeyId. Secondo la reference di eas.json, questi tre campi accettano variabili d'ambiente, come$ASC_API_KEY_PATH.
Sulla mia ultima app, l'opzione --auto-submit voleva un Apple ID per creare la sua chiave di invio. Ho messo i tre campi della mia chiave nel profilo della mia copia di lavoro, mai committata. Poi ho inviato il build finito con --id e --non-interactive.
"EXPO_APPLE_APP_SPECIFIC_PASSWORD must be in the format xxxx-xxxx-xxxx-xxxx, where x is a lowercase letter."
La variabile contiene qualcosa di diverso da una password specifica per app, spesso la tua stessa password Apple. EAS CLI verifica questo formato prima di qualsiasi invio.
Secondo il supporto Apple, una password specifica per app si genera su account.apple.com, sezione App-Specific Passwords, con l'autenticazione a due fattori attiva. Viene revocata appena cambi la password del tuo account Apple. Expo considera questo metodo meno sicuro della chiave API, il suo metodo predefinito e consigliato.
Gli errori dell'account Apple
"… agree to the latest Program License Agreement in your developer account."
Il messaggio completo inizia con "You currently don't have access to this membership resource". Lato Apple, la risposta grezza può contenere "Unable to process request - PLA Update available". I passaggi di invio recenti di EAS mostrano piuttosto "A required Apple agreement is missing or has expired".
La causa è la stessa: Apple ha aggiornato un contratto, e nessuno l'ha accettato. Solo il titolare dell'account, l'Account Holder, può accettare i contratti, secondo la tabella dei ruoli di Apple. Il codice di EAS gli chiede di passare dalla pagina Business di App Store Connect, poi, se Apple lo propone, dal suo account su developer.apple.com. Poi rilancia il comando. Il contratto delle app a pagamento ha la sua guida: Paid Apps Agreement in App Store Connect.
"App Store Connect rejected the API authentication credentials."
Apple ha risposto con un errore 401, NOT_AUTHORIZED. EAS cita tre cause: una chiave non più attiva, una chiave di un altro account App Store Connect, oppure un Key ID, un contenuto della chiave o un Issuer ID sbagliato.
Controlla i due identificativi in App Store Connect, menu Users and Access, scheda Integrations. Secondo Apple, l'Issuer ID compare in cima alla pagina, e il Key ID nell'elenco delle chiavi attive. Una chiave revocata non si riattiva mai. Apple la mostra per 30 giorni sotto Revoked: devi generarne una nuova.
"App Store Connect app for application identifier … was not found."
La scheda indicata da ascAppId non si trova con la tua chiave. EAS ti chiede di controllare questo numero, e che la chiave abbia davvero accesso all'app nell'account giusto. Elenca perfino alcune app visibili con quella chiave. Con gli strumenti di invio di Apple, lo stesso problema compare come "No suitable application records were found".
Tornano tre cause, due delle quali segnalate in questo thread dei forum Apple:
- La scheda non esiste. Creala in App Store Connect, oppure togli
ascAppIdperché sia il comando a crearla. - Il numero viene da un altro account. Hai copiato l'
ascAppIddi un altro team, o di un altro progetto. - L'utente non ha accesso all'app. Un App Manager o un Developer può essere limitato ad alcune app. Una chiave di team, invece, accede a tutte le app dell'account.
"… is not available to team" o "… is not available to provider"
Questo messaggio compare quando EAS crea la scheda al posto tuo, in mancanza di ascAppId. Il bundle identifier è già usato da un altro team. EAS ti chiede di cambiarlo nella configurazione della tua app, poi di rilanciare.
"App name "…" is already taken. Using generated name "…""
Non è un fallimento. Quando il nome è già preso sull'App Store, EAS aggiunge sei caratteri a caso e riprova, fino a cinque volte. Rinominerai la scheda più tardi in App Store Connect. Per evitarlo, compila appName e language nel profilo prima del primo invio: senza language, la lingua principale è en-US.
Gli errori del binario: i codici ITMS
Dopo l'invio, Apple elabora il build. Se lo rifiuta, il log cita uno o più codici ITMS. Ecco quelli che il passaggio di invio di EAS riconosce e traduce:
| Codice ITMS | Cosa rifiuta Apple | Soluzione |
|---|---|---|
| 90189 | Numero di build già usato | autoIncrement |
| 90062, 90186, 90478 | Versione chiusa o già superata | Aumentare version |
| 90683 | Frase di autorizzazione mancante | ios.infoPlist |
| 90725 | SDK iOS troppo vecchio | Immagine iOS o SDK Expo |
| 90054, 90055 | Bundle diverso dalla scheda indicata | Correggere ascAppId |
| 90022, 90023, 90391, 90713 | Icone mancanti o dichiarate male | Rivedere le icone |
| 90771 | Identificativi dei task in background mancanti | ios.infoPlist |
Tre precisazioni tratte da questi messaggi:
- Il numero di build è unico per versione. Per 90189, EAS consiglia
"autoIncrement": trueineas.json. Trovi tutto in numero di build e versione. - Per 90725, EAS consiglia di scegliere un'immagine iOS più recente in
eas.json, e se serve di passare a un SDK di Expo supportato. - Per 90771, il tuo Info.plist dichiara la modalità in background
processing, ma non la chiaveBGTaskSchedulerPermittedIdentifiers.
Tranne che per 90054 e 90055, dove basta puntare alla scheda giusta o a un altro build, la soluzione tocca il binario: rifai il build, poi rinvialo. Due codici hanno la loro guida: ITMS-90683 con Expo e ITMS-90725.
A fine settembre 2026, un build di Solys è stato rifiutato alla consegna per ITMS-90683. Avevo tolto una frase di autorizzazione sulle foto durante una pulizia del file di configurazione. Solys non usa le foto, ma una libreria del progetto chiama l'API Photos di iOS. Apple analizza il binario, non l'uso reale: da allora non tolgo mai più queste frasi.
Lo stato Missing Compliance, invece, non è un errore di invio. Manca la tua dichiarazione sulla crittografia, spiegata nella guida alla pubblicazione con EAS.
La mia checklist prima di ogni invio
ascAppIdè nel profilosubmit, aggiunto prima del build.- La chiave API è gestita da EAS, oppure i suoi tre campi puntano a un
.p8tenuto fuori dal repository. - L'Account Holder ha accettato gli ultimi contratti in App Store Connect.
autoIncrementè attivo, con"appVersionSource": "remote", consigliato da Expo da EAS CLI 12.- La
versionè superiore all'ultima versione approvata. - Ogni API sensibile presente nel binario ha la sua frase di autorizzazione.
- Per un'app nuova,
appNameelanguagesono compilati prima del primo invio.
Inviare la tua prima app senza restare bloccato
Il comando è solo un passaggio. L'iOS & Android Kit parte dal codice di base delle mie app, abbonamenti inclusi, e segue quattro tappe fino all'App Store, con i tuoi tempi.
Se stai preparando la tua prima uscita, fai la diagnosi gratuita: ti dice cosa ti blocca davvero e ti manda la mia checklist anti-rifiuto Apple. Per la scheda, gli screenshot e l'approvazione, la pagina pubblicare un'app sull'App Store riprende ogni passaggio.
Domande frequenti
Perché eas submit fallisce solo in integrazione continua?
In modalità --non-interactive, il comando non può chiederti nulla. Gli servono ascAppId nel profilo e una chiave API già collegata all'app, oppure i suoi tre campi in eas.json. Sul tuo computer, ti avrebbe fatto queste domande.
Bisogna rifare il build dopo un errore di eas submit?
Solo se Apple rifiuta il binario, con un codice ITMS. Eccezione: per ITMS-90054 e 90055, il build puntava alla scheda sbagliata, basta rinviarlo a quella giusta. Gli errori di configurazione e di account si correggono in eas.json, in App Store Connect o nel tuo account Apple. Poi rinvii lo stesso build, per esempio con --latest o --id.
Dove vedo i log di un invio EAS Submit?
Nella pagina dell'invio, nella dashboard di Expo. Expo consiglia di leggere lì i log e il riquadro "Build Annotations". Nel terminale, aggiungi --verbose per mostrare sempre i log.
Si può usare eas submit con un account Apple gratuito?
No. Expo richiede un account Apple Developer a pagamento per inviare un'app all'App Store. L'account gratuito permette di fare test sul tuo iPhone, non di usare App Store Connect.
Che ruolo dare alla chiave API per eas submit?
La guida di Expo assegna alla chiave il ruolo Admin. Secondo la tabella dei ruoli di Apple, l'invio dei build è aperto anche ai ruoli App Manager e Developer. I miei build Expo girano con una chiave di team con ruolo App Manager. Solo l'Account Holder e gli Admin possono generare una chiave di team.
Cosa significa "Increment Build Number" in EAS?
Apple ha rifiutato il build con il codice ITMS-90189: questo numero di build esiste già per questa versione. Attiva "autoIncrement": true in eas.json, oppure aumenta ios.buildNumber, poi rifai il build.

