# EAS Submit iOS: pubblicare un'app Expo sull'App Store

> EAS Submit invia il tuo build iOS ad App Store Connect, dove arriva in TestFlight. L'invio in revisione lo fai tu in App Store Connect.

Pagina originale: [EAS Submit iOS: pubblicare un'app Expo sull'App Store](https://devoria.fr/it/blog/eas-submit-ios-pubblicare-app-expo-app-store)
Autore: [Mehdi Azizi](https://devoria.fr/it/mehdi-azizi)
Pubblicazione: 2026-10-25
Ultima revisione dei contenuti: 2026-10-25


`eas submit --platform ios` invia il tuo build iOS ad App Store Connect, dove compare in TestFlight dopo l'elaborazione da parte di Apple. **Il comando non invia la tua app alla revisione di Apple: la scelta del build e l'invio in revisione restano da fare in App Store Connect.** Per automatizzarlo, gli servono il numero della tua scheda (`ascAppId`) e una chiave API di App Store Connect.

Pubblico le mie app iOS, tra cui Solys, TradaZen e Nolera, con Expo, EAS Build ed EAS Submit. Questa guida segue la [documentazione di Expo sull'invio iOS](https://docs.expo.dev/submit/ios/), riletta il 25 ottobre 2026. Se non hai un Mac, il percorso completo è in [pubblicare un'app iOS senza Mac](https://devoria.fr/it/blog/pubblicare-app-ios-senza-mac-expo-eas). Qui ci concentriamo sull'invio.

## Cosa ti serve prima del primo comando

Expo elenca tre prerequisiti:

- **Un account Apple Developer a pagamento.** Prezzo e iscrizione sono in [account sviluppatore Apple](https://devoria.fr/it/blog/account-sviluppatore-apple-prezzo).
- **Un bundle identifier** in `ios.bundleIdentifier`. Secondo [il riferimento della configurazione Expo](https://docs.expo.dev/versions/latest/config/app/), lo inventi tu, ma deve essere unico sull'App Store.
- **EAS CLI installato**, poi `eas login` con il tuo account Expo.

Ti serve anche un build di produzione firmato. Lo crea EAS Build con il certificato e il profilo che gestisce per te, come spiega certificato e provisioning profile iOS.

### La scheda App Store Connect: tu o EAS?

EAS Submit invia un binario verso un'app che deve esistere in App Store Connect.

**Puoi crearla tu.** [L'aiuto di Apple](https://developer.apple.com/help/app-store-connect/create-an-app-record/add-a-new-app) descrive la finestra New App: piattaforma, nome, lingua principale, bundle identifier, SKU e accesso degli utenti. Serve il ruolo Account Holder, Admin o App Manager.

**Oppure può crearla EAS al primo invio.** Secondo [la pagina di Expo su TestFlight](https://docs.expo.dev/submit/testflight/), `eas submit` crea la scheda quando invii il tuo primo build. Secondo [il riferimento di eas.json](https://docs.expo.dev/eas/json/), se compili `ascAppId` questo passaggio viene saltato. Il nome viene da `appName` o, in mancanza, dal `name` della tua configurazione. La lingua principale viene da `language`, che di default vale `en-US`. **Se la tua app esce prima in italiano, imposta `language` prima di questo primo invio.**

Poi copia il numero della scheda in `ascAppId`. Expo spiega dove trovarlo: apri la tua app in App Store Connect, poi App Information. È il campo Apple ID, sotto General Information. **È un numero, non il tuo bundle identifier.**

## Perché una chiave API invece del tuo Apple ID

EAS Submit si collega ad Apple con il tuo Apple ID o con una chiave API di App Store Connect.

L'Apple ID si scontra con l'autenticazione a due fattori, che [Apple richiede](https://developer.apple.com/support/authentication/) a tutti gli utenti di App Store Connect: serve una persona che confermi l'accesso. La password specifica per app, passata in `EXPO_APPLE_APP_SPECIFIC_PASSWORD`, evita questo passaggio, ma [Expo la considera meno sicura](https://github.com/expo/fyi/blob/main/apple-app-specific-password.md) della chiave API, il suo metodo predefinito e consigliato. **La chiave permette di autenticarsi senza alcuna interazione, e quindi di automatizzare l'invio.**

Due strade per ottenerla:

- **Lascia che la gestisca EAS.** Lancia `eas credentials --platform ios`, scegli il profilo `production`, accedi al tuo account Apple, poi scegli "App Store Connect: Manage your API Key".
- **Usa una chiave tua.** In App Store Connect: Users and Access, scheda Integrations, App Store Connect API, Team Keys, poi Generate API Key. Serve un account Admin, e [la guida di Expo](https://github.com/expo/fyi/blob/main/creating-asc-api-key.md) assegna alla chiave il ruolo Admin.

Nel secondo caso, annota il Key ID, mostrato nell'elenco delle chiavi attive, e l'Issuer ID, [in alto nella pagina Integrations](https://developer.apple.com/documentation/appstoreconnectapi/generating-tokens-for-api-requests). Soprattutto, conserva il file `.p8`: [puoi scaricarlo una sola volta](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api), e Apple non ne tiene nessuna copia.

> Secondo Apple, una chiave Admin può creare ed eliminare utenti del tuo account. Apple chiede di non mettere mai la chiave in un repository di codice.

## Il file eas.json minimo da copiare

Tutti i valori sono finti: sostituiscili con i tuoi.

```json
{
  "cli": {
    "appVersionSource": "remote"
  },
  "build": {
    "production": {
      "autoIncrement": true
    }
  },
  "submit": {
    "production": {
      "ios": {
        "ascAppId": "1234567890",
        "appleTeamId": "ABCDE12345",
        "ascApiKeyPath": "./keys/AuthKey_XXXXXXXXXX.p8",
        "ascApiKeyIssuerId": "your-issuer-id",
        "ascApiKeyId": "XXXXXXXXXX"
      }
    }
  }
}
```

- **`appVersionSource` e `autoIncrement`**: i server di EAS tengono il numero di build e lo incrementano a ogni build di produzione. [Expo consiglia questa modalità remota](https://docs.expo.dev/build-reference/app-versions/) da EAS CLI 12.
- **`ascAppId`**: il numero della tua scheda. Senza, la modalità non interattiva fallisce.
- **`appleTeamId`**: l'identificativo del tuo team Apple Developer.
- **`ascApiKeyPath`, `ascApiKeyIssuerId`, `ascApiKeyId`**: la tua chiave API. Tutti e tre i campi accettano variabili d'ambiente. Aggiungi la cartella `keys` al tuo `.gitignore`.

Il campo `appleId` serve solo se accedi con il tuo Apple ID. Se EAS gestisce già la tua chiave, togli anche i tre campi `ascApiKey`. Nelle mie tre app, ricontrollate il 25 ottobre, il profilo di invio di produzione contiene solo `ascAppId`, più `appleTeamId` su Solys: nessuna chiave nel file.

## Lanciare il build, poi l'invio

```bash
eas build --platform ios --profile production
eas submit --platform ios
```

Senza altre opzioni, `eas submit` ti fa scegliere il build da inviare e, al primo avvio, ti chiede il tuo Apple ID. Il profilo di invio `production` viene usato di default, se esiste. Il [riferimento di EAS CLI](https://docs.expo.dev/eas/cli/) elenca le opzioni che evitano la scelta:

| Opzione          | Cosa fa                      |
| ---------------- | ---------------------------- |
| `--latest`       | Invia l'ultimo build iOS     |
| `--id`           | Invia un build EAS specifico |
| `--path`         | Invia un file .ipa locale    |
| `--url`          | Invia un archivio online     |
| `--groups`       | Aggiunge a un gruppo interno |
| `--what-to-test` | Compila "What to test"       |

Per concatenare tutto, aggiungi `--auto-submit` al comando di build. Secondo [la pagina di Expo sull'invio automatico](https://docs.expo.dev/build/automate-submissions/), il build completato parte verso EAS Submit con il profilo di invio che ha lo stesso nome del profilo di build. Per sceglierne un altro: `--auto-submit-with-profile=nome`. **Il build va in TestFlight, non in revisione.**

In integrazione continua, aggiungi `--non-interactive` e un token `EXPO_TOKEN`. A quel punto il comando non può chiederti niente: gli servono `ascAppId` nel profilo e una chiave API, quella che EAS ha associato all'app oppure la tua nei tre campi `ascApiKey`.

## Cosa succede dopo l'invio

**1. Apple elabora il build.** Deve passare per questa elaborazione prima di comparire in App Store Connect, e alla fine [Apple ti manda un'email](https://developer.apple.com/help/app-store-connect/manage-builds/upload-builds). Expo parla in genere di 10-15 minuti prima di vederlo in TestFlight.

**2. La conformità all'esportazione.** Lo stato Missing Compliance significa che manca la tua dichiarazione sulla crittografia. App Store Connect fa queste domande a ogni nuova versione, a meno che l'Info.plist non risponda già. Con Expo, la chiave si chiama `ios.config.usesNonExemptEncryption`:

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

Secondo [Apple](https://developer.apple.com/documentation/security/complying-with-encryption-export-regulations), `false` va bene se la tua app, librerie comprese, non usa nessuna crittografia o solo una crittografia esente. La crittografia di sistema, come l'HTTPS tramite URLSession, in genere lo è. **Dichiara `false` solo se è vero per la tua app: la dichiarazione ti impegna.** Come ogni chiave dell'Info.plist, richiede un nuovo build.

**3. TestFlight.** Allo stato Ready to Submit, [secondo Apple](https://developer.apple.com/help/app-store-connect/reference/app-build-statuses), il build può andare ai tester interni, passare la revisione beta per quelli esterni o andare in revisione App Store. Il campo `groups` del profilo lo aggiunge ai tuoi gruppi interni. Tutto il resto è in [TestFlight per testare la tua app](https://devoria.fr/it/blog/testflight-testare-app-iphone-prima-invio).

## L'invio non è l'invio in revisione

[Lo scrive Expo](https://docs.expo.dev/submit/introduction/): un build TestFlight non viene pubblicato automaticamente sull'App Store. EAS Submit non compila né la tua scheda né i tuoi screenshot. Restano quattro passaggi in App Store Connect, descritti nell'[aiuto di Apple sull'invio in revisione](https://developer.apple.com/help/app-store-connect/manage-submissions-to-app-review/submit-an-app):

1. **Compila i metadati obbligatori** della versione.
2. **Scegli il build** nella sezione Build della versione.
3. **Clicca "Add for Review".** La versione passa a Ready for Review, ma ancora niente è partito in revisione.
4. **Clicca "Submit for Review".** Lo stato passa a In Review quando inizia la revisione.

## Gli errori frequenti e come correggerli

| Errore mostrato    | Causa                       | Correzione                |
| ------------------ | --------------------------- | ------------------------- |
| ITMS-90189         | Numero di build già usato   | `autoIncrement`           |
| ITMS-90062 o 90186 | Versione già chiusa         | Aumentare `version`       |
| "Set ascAppId"     | `ascAppId` assente in CI    | Aggiungere `ascAppId`     |
| "API Keys cannot"  | Nessuna chiave associata    | `eas credentials`         |
| ITMS-90683         | Purpose string mancante     | `ios.infoPlist`           |
| ITMS-91053         | Manifest incompleto         | `ios.privacyManifests`    |
| ITMS-90725         | SDK iOS troppo vecchio      | Aggiornare l'SDK Expo     |
| Missing Compliance | Crittografia non dichiarata | `usesNonExemptEncryption` |

Secondo Expo, il numero di build già usato è una causa comune di rifiuto all'invio: trovi tutto in numero di build e versione. Tre errori hanno una guida dedicata: [ITMS-90683 con Expo](https://devoria.fr/it/blog/itms-90683-missing-purpose-string-expo), [ITMS-91053 con Expo](https://devoria.fr/it/blog/itms-91053-missing-api-declaration-expo) e ITMS-90725.

I due messaggi tra virgolette vengono da EAS e si correggono nella sua configurazione. Missing Compliance si risolve anche rispondendo alle domande in App Store Connect. **Per tutte le altre righe, la correzione riguarda il binario: rifai un build, poi rinvialo.** Un aggiornamento da remoto non cambia né l'Info.plist, né il manifest, né i numeri.

## Inviare la tua prima app senza andare a tentativi

Il comando è solo un passaggio. L'[iOS Kit](https://devoria.fr/it/kits/ios) parte dal codice di base delle mie app, abbonamenti compresi, e ti guida in 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 di Apple. Per la scheda, gli screenshot e l'approvazione, la pagina [pubblicare un'applicazione sull'App Store](https://devoria.fr/it/expertise/pubblicare-app-su-app-store) copre ogni passaggio.

## Domande frequenti

### Come si pubblica un'app Expo sull'App Store?

Lancia un build di produzione con EAS Build, poi invialo con `eas submit --platform ios`. Dopo l'elaborazione di Apple, compare in TestFlight. In App Store Connect, poi, compila la scheda, scegli quel build nella versione e clicca "Add for Review" e "Submit for Review".

### EAS Submit invia la mia app in revisione ad Apple?

No. EAS Submit invia il binario ad App Store Connect e il build arriva in TestFlight. L'invio in revisione si fa a mano in App Store Connect, dopo aver compilato la scheda e scelto il build.

### Dove trovo l'ascAppId della mia app?

In App Store Connect, apri la tua app, poi App Information. È il campo Apple ID, sotto General Information. È un numero, da non confondere con il tuo bundle identifier.

### Serve un Apple ID per usare eas submit?

Al primo avvio, il comando te lo chiede. Dopo, con `ascAppId` nel profilo e una chiave API di App Store Connect, può girare senza interazione, anche in integrazione continua. La chiave API è il metodo predefinito e consigliato da Expo.

### Quanto tempo ci vuole per vedere il build in TestFlight?

Expo parla in genere di 10-15 minuti di elaborazione da parte di Apple, che alla fine ti manda un'email. Se il build resta allo stato Missing Compliance, rispondi alle domande sulla crittografia, poi dichiarala nella tua configurazione per i build successivi.


## Il tuo progetto

[Apple Review Kit](https://devoria.fr/it/kits/review-apple): La checklist review App Store che uso, i miei rifiuti di Apple corretti, le note per il revisore e due skill Claude Code che rileggono la tua app. 29 €.

[iOS Kit](https://devoria.fr/it/kits/ios): Crea la tua app iPhone con Claude Code: lo Starter Code delle mie app, gli skill che verificano il suo lavoro, e l'Apple Review Kit, l'App Store Screenshots Kit e l'ASO Kit. 129,99 €.
