# eas submit iOS: errori comuni e come risolverli

> eas submit fallisce? I veri messaggi di EAS e App Store Connect, la causa e la soluzione: ascAppId, chiave API, contratto Apple, codici ITMS.

Pagina originale: [eas submit iOS: errori comuni e come risolverli](https://devoria.fr/it/blog/eas-submit-ios-errori-soluzioni)
Autore: [Mehdi Azizi](https://devoria.fr/it/mehdi-azizi)
Pubblicazione: 2026-11-04
Ultima revisione dei contenuti: 2026-11-04


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](https://github.com/expo/eas-cli), 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](https://devoria.fr/it/blog/eas-submit-ios-pubblicare-app-expo-app-store). Qui si ripara.

## Cosa fa eas submit, e cosa gli serve

Secondo [la documentazione di Expo](https://docs.expo.dev/deploy/submit-to-app-stores/), 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](https://docs.expo.dev/submit/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:

- **`ascAppId`** nel profilo `submit` di `eas.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)](https://devoria.fr/it/blog/chiave-api-app-store-connect-p8).

Il profilo minimo sta in poche righe. Il valore è fittizio:

```json
{
  "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](https://docs.expo.dev/deploy/submit-to-app-stores/) 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](https://docs.expo.dev/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](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/src/submit/ios/IosSubmitCommand.ts) 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](https://github.com/expo/fyi/blob/main/asc-app-id.md): 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 `ascAppId` prima del build, non dopo. Fino all'SDK 57, [l'impronta calcolata da Expo](https://github.com/expo/expo/blob/main/packages/@expo/fingerprint/src/sourcer/Expo.ts) include sempre `eas.json`. Su Vigie, la cui runtime version segue la policy `fingerprint`, 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`, ignora `eas.json`, secondo [il changelog di 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."

Il tuo profilo non contiene una chiave, ed EAS non ne ha nessuna collegata alla tua app. [Expo lo precisa](https://docs.expo.dev/submit/ios/): 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 ios` in modalità interattiva, sul tuo computer, e lascialo configurare una chiave API App Store Connect per la tua app.
- **Usa la tua chiave** in `ascApiKeyPath`, `ascApiKeyIssuerId` e `ascApiKeyId`. Secondo [la reference di eas.json](https://docs.expo.dev/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](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/src/submit/ios/IosSubmitCommand.ts) verifica questo formato prima di qualsiasi invio.

Secondo [il supporto Apple](https://support.apple.com/en-us/102654), 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](https://github.com/expo/fyi/blob/main/apple-app-specific-password.md), 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](https://developer.apple.com/help/account/access/roles/). [Il codice di EAS](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/utils/ios/AscApiClient.ts) 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](https://devoria.fr/it/blog/paid-apps-agreement-stati-w-8ben-primo-pagamento).

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

Apple ha risposto con un errore 401, `NOT_AUTHORIZED`. [EAS](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/utils/ios/AscApiClient.ts) 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](https://developer.apple.com/documentation/appstoreconnectapi/generating-tokens-for-api-requests), 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](https://developer.apple.com/documentation/appstoreconnectapi/revoking-api-keys) 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](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/utils/ios/AscApiUtils.ts) 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](https://developer.apple.com/forums/thread/106806):

- **La scheda non esiste.** Creala in App Store Connect, oppure togli `ascAppId` perché sia il comando a crearla.
- **Il numero viene da un altro account.** Hai copiato l'`ascAppId` di 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](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api) 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](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/src/credentials/ios/appstore/ensureAppExists.ts) 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`](https://docs.expo.dev/eas/json/).

## 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](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/functions/uploadToAsc.ts) 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": true` in `eas.json`. Trovi tutto in [numero di build e versione](https://devoria.fr/it/blog/build-number-app-store-connect-versione-numero-build).
- **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 chiave `BGTaskSchedulerPermittedIdentifiers`.

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](https://devoria.fr/it/blog/itms-90683-missing-purpose-string-expo) e [ITMS-90725](https://devoria.fr/it/blog/itms-90725-sdk-version-issue-expo).

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](https://devoria.fr/it/blog/eas-submit-ios-pubblicare-app-expo-app-store).

## La mia checklist prima di ogni invio

- `ascAppId` è nel profilo `submit`, aggiunto prima del build.
- La chiave API è gestita da EAS, oppure i suoi tre campi puntano a un `.p8` tenuto fuori dal repository.
- L'Account Holder ha accettato gli ultimi contratti in App Store Connect.
- `autoIncrement` è attivo, con `"appVersionSource": "remote"`, [consigliato da Expo](https://docs.expo.dev/build-reference/app-versions/) 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, `appName` e `language` sono compilati prima del primo invio.

## Inviare la tua prima app senza restare bloccato

Il comando è solo un passaggio. L'[iOS & Android Kit](https://devoria.fr/it/kits/ios) 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](https://devoria.fr/it/diagnostic): 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](https://devoria.fr/it/expertise/pubblicare-app-su-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.


## Il tuo progetto

[Review Kit](https://devoria.fr/it/kits/app-review): La mia checklist per la review dell'App Store, i rifiuti di Apple che ho risolto, quella di Google Play e tre skill per Claude Code. 49 €.

[iOS & Android Kit](https://devoria.fr/it/kits/ios): Crea la tua app iPhone e Android con Claude Code: il codice di partenza delle mie app, il percorso fino agli store e tutti i kit. 99 €.

[Diagnosi: cosa ti separa dalla tua app per iPhone](https://devoria.fr/it/diagnostic): 7 domande, 60 secondi: scopri cosa ti blocca davvero nel pubblicare la tua app per iPhone, il tuo percorso in 4 tappe e il kit giusto per te.
