# EAS Submit iOS: publicarea unei aplicații Expo pe App Store

> EAS Submit trimite build-ul iOS în App Store Connect, unde apare în TestFlight. Trimiterea la review o faci tu în App Store Connect.

Pagina originală: [EAS Submit iOS: publicarea unei aplicații Expo pe App Store](https://devoria.fr/ro/blog/eas-submit-ios-publicare-aplicatie-expo-app-store)
Autor: [Mehdi Azizi](https://devoria.fr/ro/mehdi-azizi)
Publicare: 2026-10-25
Ultima revizuire a conținutului: 2026-10-25


`eas submit --platform ios` trimite build-ul tău iOS în App Store Connect, unde apare în TestFlight după ce Apple îl procesează. **Comanda nu trimite aplicația la review-ul Apple: alegerea build-ului și trimiterea la review le faci tot tu, în App Store Connect.** Ca s-o automatizezi, are nevoie de numărul fișei aplicației (`ascAppId`) și de o cheie API App Store Connect.

Îmi public aplicațiile iOS, printre care Solys, TradaZen și Nolera, cu Expo, EAS Build și EAS Submit. Ghidul ăsta urmează [documentația Expo despre trimiterea pe iOS](https://docs.expo.dev/submit/ios/), recitită pe 25 octombrie 2026. Dacă n-ai Mac, tot parcursul e în [publicarea unei aplicații iOS fără Mac](https://devoria.fr/ro/blog/publicare-aplicatie-ios-fara-mac-expo-eas). Aici ne concentrăm pe trimitere.

## Ce-ți trebuie înainte de prima comandă

Expo enumeră trei condiții:

- **Un cont Apple Developer plătit.** Prețul și înscrierea sunt în [contul de dezvoltator Apple](https://devoria.fr/ro/blog/cont-developer-apple-pret-gratuit-99-dolari).
- **Un bundle identifier** în `ios.bundleIdentifier`. Conform [referinței configurației Expo](https://docs.expo.dev/versions/latest/config/app/), îl inventezi tu, dar trebuie să fie unic pe App Store.
- **EAS CLI instalat**, apoi `eas login` cu contul tău Expo.

Îți mai trebuie și un build de producție semnat. EAS Build îl face cu certificatul și profilul pe care le gestionează pentru tine, cum explic în certificat și provisioning profile iOS.

### Fișa din App Store Connect: o creezi tu sau EAS?

EAS Submit trimite un binar către o aplicație care trebuie să existe deja în App Store Connect.

**Poți s-o creezi singur.** [Ajutorul Apple](https://developer.apple.com/help/app-store-connect/create-an-app-record/add-a-new-app) descrie fereastra New App: platformă, nume, limbă principală, bundle identifier, SKU și accesul utilizatorilor. Ai nevoie de rolul Account Holder, Admin sau App Manager.

**Poate s-o creeze și EAS la prima trimitere.** Conform [paginii Expo despre TestFlight](https://docs.expo.dev/submit/testflight/), `eas submit` creează fișa când trimiți primul build. Conform [referinței eas.json](https://docs.expo.dev/eas/json/), dacă completezi `ascAppId`, pasul ăsta e sărit. Numele vine din `appName` sau, dacă lipsește, din `name`-ul din configurație. Limba principală vine din `language`, care e implicit `en-US`. **Dacă aplicația ta iese întâi în franceză, completează `language` înainte de prima trimitere.**

Apoi copiază numărul fișei în `ascAppId`. Expo îți spune unde-l găsești: deschide aplicația în App Store Connect, apoi App Information. E câmpul Apple ID, sub General Information. **E un număr, nu bundle identifier-ul tău.**

## De ce o cheie API și nu Apple ID-ul tău

EAS Submit se conectează la Apple cu Apple ID-ul tău sau cu o cheie API App Store Connect.

Apple ID-ul se lovește de autentificarea în doi pași, pe care [Apple o cere](https://developer.apple.com/support/authentication/) tuturor utilizatorilor App Store Connect: e nevoie de un om care să confirme conectarea. Parola specifică aplicației, pusă în `EXPO_APPLE_APP_SPECIFIC_PASSWORD`, ocolește pasul ăsta, dar [Expo o consideră mai puțin sigură](https://github.com/expo/fyi/blob/main/apple-app-specific-password.md) decât cheia API, metoda lor implicită și recomandată. **Cheia permite autentificarea fără nicio interacțiune, deci poți automatiza trimiterea.**

Două căi ca s-o obții:

- **Lasă EAS s-o gestioneze.** Rulează `eas credentials --platform ios`, alege profilul `production`, conectează-te la contul Apple, apoi alege „App Store Connect: Manage your API Key".
- **Adu-ți propria cheie.** În App Store Connect: Users and Access, tabul Integrations, App Store Connect API, Team Keys, apoi Generate API Key. Ai nevoie de un cont Admin, iar [ghidul Expo](https://github.com/expo/fyi/blob/main/creating-asc-api-key.md) îi dă cheii rolul Admin.

În al doilea caz, notează Key ID-ul, afișat în lista cheilor active, și Issuer ID-ul, [sus pe pagina Integrations](https://developer.apple.com/documentation/appstoreconnectapi/generating-tokens-for-api-requests). Și mai ales păstrează fișierul `.p8`: [îl poți descărca o singură dată](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api), iar Apple nu păstrează nicio copie.

> O cheie Admin poate, conform Apple, să creeze și să șteargă utilizatori din contul tău. Apple cere să nu pui niciodată cheia într-un repository de cod.

## Fișierul eas.json minimal de copiat

Toate valorile sunt fictive: înlocuiește-le cu ale tale.

```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` și `autoIncrement`**: serverele EAS păstrează numărul de build și îl cresc la fiecare build de producție. [Expo recomandă acest mod remote](https://docs.expo.dev/build-reference/app-versions/) începând cu EAS CLI 12.
- **`ascAppId`**: numărul fișei tale. Fără el, modul non-interactiv eșuează.
- **`appleTeamId`**: identificatorul echipei tale Apple Developer.
- **`ascApiKeyPath`, `ascApiKeyIssuerId`, `ascApiKeyId`**: cheia ta API. Toate trei acceptă variabile de mediu. Adaugă folderul `keys` în `.gitignore`.

Câmpul `appleId` contează doar dacă te conectezi cu Apple ID-ul. Dacă EAS îți gestionează deja cheia, scoate și cele trei câmpuri `ascApiKey`. La cele trei aplicații ale mele, verificate pe 25 octombrie, profilul de trimitere de producție conține doar `ascAppId`, plus `appleTeamId` la Solys: nicio cheie în fișier.

## Pornești build-ul, apoi trimiterea

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

Fără alte opțiuni, `eas submit` te pune să alegi build-ul de trimis și, la prima rulare, îți cere Apple ID-ul. Profilul de trimitere `production` e folosit implicit dacă există. [Referința EAS CLI](https://docs.expo.dev/eas/cli/) listează opțiunile care te scutesc de alegere:

| Opțiune          | Ce face                      |
| ---------------- | ---------------------------- |
| `--latest`       | Trimite ultimul build iOS    |
| `--id`           | Trimite un anumit build EAS  |
| `--path`         | Trimite un fișier .ipa local |
| `--url`          | Trimite o arhivă online      |
| `--groups`       | Adaugă într-un grup intern   |
| `--what-to-test` | Completează „What to test"   |

Ca să legi totul, adaugă `--auto-submit` la comanda de build. Conform [paginii Expo despre trimiterea automată](https://docs.expo.dev/build/automate-submissions/), build-ul terminat pleacă spre EAS Submit cu profilul de trimitere care are același nume ca profilul de build. Ca să alegi altul: `--auto-submit-with-profile=nume`. **Build-ul pleacă în TestFlight, nu la review.**

În integrare continuă, adaugă `--non-interactive` și un token `EXPO_TOKEN`. Comanda nu te mai poate întreba nimic: are nevoie de `ascAppId` în profil și de o cheie API, fie cea atașată aplicației de EAS, fie a ta în cele trei câmpuri `ascApiKey`.

## Ce se întâmplă după trimitere

**1. Apple procesează build-ul.** Trebuie să treacă prin procesarea asta înainte să apară în App Store Connect, iar [Apple îți trimite un e-mail](https://developer.apple.com/help/app-store-connect/manage-builds/upload-builds) la final. Expo vorbește de obicei de 10 până la 15 minute până îl vezi în TestFlight.

**2. Conformitatea la export.** Statusul Missing Compliance înseamnă că lipsește declarația ta despre criptare. App Store Connect pune întrebările astea la fiecare versiune nouă, dacă Info.plist nu le răspunde deja. Cu Expo, cheia se numește `ios.config.usesNonExemptEncryption`:

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

Conform [Apple](https://developer.apple.com/documentation/security/complying-with-encryption-export-regulations), `false` e potrivit dacă aplicația ta, inclusiv bibliotecile, nu folosește deloc criptare sau doar criptare scutită. Criptarea sistemului, cum e HTTPS prin URLSession, e în general scutită. **Declară `false` doar dacă e adevărat pentru aplicația ta: declarația te angajează.** Ca orice cheie din Info.plist, cere un build nou.

**3. TestFlight.** La statusul Ready to Submit, [conform Apple](https://developer.apple.com/help/app-store-connect/reference/app-build-statuses), build-ul poate merge la testerii interni, poate trece prin review-ul beta pentru cei externi sau poate pleca la review-ul App Store. Câmpul `groups` din profil îl adaugă în grupurile tale interne. Restul e în [TestFlight pentru testarea aplicației](https://devoria.fr/ro/blog/testflight-testare-aplicatie-iphone).

## Trimiterea nu e același lucru cu trimiterea la review

[Expo o spune](https://docs.expo.dev/submit/introduction/): un build TestFlight nu e publicat automat pe App Store. EAS Submit nu-ți completează nici fișa, nici capturile de ecran. Mai ai patru pași în App Store Connect, descriși în [ajutorul Apple despre trimiterea la review](https://developer.apple.com/help/app-store-connect/manage-submissions-to-app-review/submit-an-app):

1. **Completează metadatele obligatorii** ale versiunii.
2. **Alege build-ul** în secțiunea Build a versiunii.
3. **Apasă „Add for Review".** Versiunea trece în Ready for Review, dar încă n-a plecat nimic la review.
4. **Apasă „Submit for Review".** Statusul trece în In Review când începe review-ul.

## Erorile frecvente și cum le repari

| Eroare afișată       | Cauză                          | Reparație                 |
| -------------------- | ------------------------------ | ------------------------- |
| ITMS-90189           | Număr de build deja folosit    | `autoIncrement`           |
| ITMS-90062 sau 90186 | Versiune deja închisă          | Crește `version`          |
| „Set ascAppId"       | `ascAppId` lipsă în CI         | Adaugă `ascAppId`         |
| „API Keys cannot"    | Nicio cheie atașată            | `eas credentials`         |
| ITMS-90683           | Lipsește textul de justificare | `ios.infoPlist`           |
| ITMS-91053           | Manifest incomplet             | `ios.privacyManifests`    |
| ITMS-90725           | SDK iOS prea vechi             | Crește SDK-ul Expo        |
| Missing Compliance   | Criptare nedeclarată           | `usesNonExemptEncryption` |

Conform Expo, numărul de build deja folosit e o cauză des întâlnită de respingere la trimitere: totul e în numărul de build și versiunea. Trei erori au propriul ghid: [ITMS-90683 cu Expo](https://devoria.fr/ro/blog/itms-90683-missing-purpose-string-expo), [ITMS-91053 cu Expo](https://devoria.fr/ro/blog/itms-91053-missing-api-declaration-expo) și ITMS-90725.

Cele două mesaje între ghilimele vin de la EAS și se repară în configurația lui. Missing Compliance se rezolvă și răspunzând la întrebări în App Store Connect. **Pentru toate celelalte rânduri, reparația atinge binarul: fă un build nou, apoi retrimite-l.** O actualizare la distanță nu schimbă nici Info.plist, nici manifestul, nici numerele.

## Trimite-ți prima aplicație fără să bâjbâi

Comanda e doar un pas. [iOS Kit](https://devoria.fr/ro/kits/ios) pornește de la codul de bază al aplicațiilor mele, cu abonamente cu tot, și te duce în patru pași până pe App Store, în ritmul tău.

Dacă pregătești prima lansare, [fă-ți diagnosticul gratuit](https://devoria.fr/ro/diagnostic): îți spune ce te blochează de fapt și îți trimite checklist-ul meu anti-respingere Apple. Pentru fișă, capturi și validare, pagina [publicarea unei aplicații pe App Store](https://devoria.fr/ro/expertise/publicare-aplicatie-app-store) acoperă fiecare pas.

## Întrebări frecvente

### Cum public o aplicație Expo pe App Store?

Pornește un build de producție cu EAS Build, apoi trimite-l cu `eas submit --platform ios`. După procesarea Apple, apare în TestFlight. Apoi, în App Store Connect, completează fișa, alege build-ul în versiune și apasă „Add for Review" și „Submit for Review".

### EAS Submit îmi trimite aplicația la review-ul Apple?

Nu. EAS Submit trimite binarul în App Store Connect, iar build-ul ajunge în TestFlight. Trimiterea la review o faci manual în App Store Connect, după ce ai completat fișa și ai ales build-ul.

### Unde găsesc ascAppId-ul aplicației mele?

În App Store Connect, deschide aplicația, apoi App Information. E câmpul Apple ID, sub General Information. E un număr, nu-l confunda cu bundle identifier-ul.

### Am nevoie de Apple ID ca să folosesc eas submit?

La prima rulare, comanda ți-l cere. După aceea, cu `ascAppId` în profil și o cheie API App Store Connect, poate rula fără interacțiune, chiar și în integrare continuă. Cheia API e metoda implicită și recomandată de Expo.

### Cât durează până văd build-ul în TestFlight?

Expo vorbește de obicei de 10 până la 15 minute de procesare la Apple, care îți trimite un e-mail la final. Dacă build-ul rămâne în statusul Missing Compliance, răspunde la întrebările despre criptare, apoi declar-o în configurație pentru build-urile următoare.


## Proiectul tău

[Apple Review Kit](https://devoria.fr/ro/kits/review-apple): Checklistul de review App Store pe care îl folosesc, respingerile mele de la Apple corectate, notele pentru tester și două skill-uri Claude Code care îți verifică aplicația. 29 €.

[iOS Kit](https://devoria.fr/ro/kits/ios): Creează-ți aplicația iPhone cu Claude Code: codul de pornire al aplicațiilor mele, skill-urile care îi verifică munca și Apple Review Kit, App Store Screenshots Kit și ASO Kit. 129,99 €.
