# eas submit iOS: pogoste napake in kako jih odpraviš

> eas submit ne uspe? Pravi sporočili EAS in App Store Connect, vzrok in rešitev: ascAppId, ključ API, Applova pogodba, kode ITMS.

Izvirna stran: [eas submit iOS: pogoste napake in kako jih odpraviš](https://devoria.fr/sl/blog/eas-submit-ios-pogoste-napake)
Avtor: [Mehdi Azizi](https://devoria.fr/sl/mehdi-azizi)
Objava: 2026-11-04
Zadnja revizija vsebine: 2026-11-04


Ko `eas submit --platform ios` ne uspe, ti sporočilo skoraj vedno pove, kje iskati. **Bodisi je tvoja konfiguracija EAS nepopolna, bodisi te blokira Applov račun, bodisi Apple zavrne binarno datoteko.** Prva dva primera odpraviš v nekaj minutah, brez novega builda. Tretjega prepoznaš po kodi ITMS in skoraj vedno zahteva nov build.

Svoje aplikacije za iOS, med njimi Solys, TradaZen in Nolera, objavljam z Expo in EAS. Sporočila, ki jih navajam tukaj, so kopirana iz izvorne kode EAS CLI, z [uradnega Expovega repozitorija na GitHubu](https://github.com/expo/eas-cli), ki sem ga pregledal 3. novembra 2026. Stari Expov forum zdaj preusmerja na Discord, zato ostaja koda najzanesljivejši vir. Za celotno pot, od datoteke `eas.json` do oddaje v pregled, najprej preberi [EAS Submit iOS: objava aplikacije Expo v App Store](https://devoria.fr/sl/blog/eas-submit-ios-objava-aplikacije-expo-app-store). Tukaj popravljamo.

## Kaj naredi eas submit in kaj potrebuje

Po [Expovi dokumentaciji](https://docs.expo.dev/deploy/submit-to-app-stores/) ukaz pošlje tvojo datoteko `.ipa` v App Store Connect. Build se prikaže v TestFlightu, ko ga Apple obdela, običajno v 10 do 15 minutah. **Aplikacije ne odda v pregled**: to moraš narediti sam v App Store Connect.

[Expova stran o pošiljanju za iOS](https://docs.expo.dev/submit/ios/) navaja tri predpogoje:

- **plačljiv račun Apple Developer**, ki je obvezen za vsako pošiljanje v App Store;
- **identifikator bundla** v `ios.bundleIdentifier`;
- **nameščen EAS CLI**, povezan s tvojim računom Expo.

Za pošiljanje brez interakcije ista stran doda še dve nastavitvi:

- **`ascAppId`** v profilu `submit` v `eas.json`, številka tvoje strani aplikacije v App Store Connect;
- **ključ API za App Store Connect**, ki ga upravlja EAS ali ga zagotoviš sam. Ustvarjanje, vloga in preklic so podrobno opisani v [ključ API za App Store Connect (.p8)](https://devoria.fr/sl/blog/api-kljuc-app-store-connect-p8).

Minimalni profil je dolg le nekaj vrstic. Vrednost je izmišljena:

```json
{
  "submit": {
    "production": {
      "ios": {
        "ascAppId": "1234567890"
      }
    }
  }
}
```

Če EAS že hrani tvoj ključ API, ta profil zadošča. Tako je pri večini mojih aplikacij.

## Branje sporočila: tri družine napak

Preden iščeš rešitev, ugotovi, kdaj se ukaz ustavi. Ta tabela je shema, ki jo uporabim ob vsakem neuspehu.

| Trenutek neuspeha                     | Družina           | Nov build?   |
| ------------------------------------- | ----------------- | ------------ |
| Pred kakršnim koli pošiljanjem        | Konfiguracija EAS | Ne           |
| Povezava z Applom, ustvarjanje strani | Applov račun      | Ne           |
| Po pošiljanju, koda ITMS-90xxx        | Zavrnjena binarka | Skoraj vedno |

Podrobnosti prebereš na strani oddaje, v Expovi nadzorni plošči. [Expo svetuje](https://docs.expo.dev/deploy/submit-to-app-stores/), da tam prebereš dnevnike in poiščeš oblaček »Build Annotations«, ki opozarja na pogoste vzroke neuspeha. V terminalu možnost `--verbose` vedno prikaže dnevnike EAS Submit, piše v [referenci EAS CLI](https://docs.expo.dev/eas/cli/).

## Napake konfiguracije EAS

### »Set ascAppId in the submit profile (eas.json) or re-run this command in interactive mode.«

Ukaz si zagnal z `--non-interactive`, na primer v neprekinjeni integraciji, tvoj profil pa ne vsebuje `ascAppId`. [Koda EAS CLI](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/src/submit/ios/IosSubmitCommand.ts) se takrat ustavi: ne more te ničesar vprašati, niti ne more ustvariti strani namesto tebe.

**Rešitev: prepiši številko svoje strani v `ascAppId`.** [Expo pove, kje jo najdeš](https://github.com/expo/fyi/blob/main/asc-app-id.md): v App Store Connect odpri svojo aplikacijo, nato App Information. To je polje Apple ID pod General Information, število z okoli desetimi števkami. Ni tvoj Applov e-poštni naslov in ni tvoj identifikator bundla.

Pri Nolera je ukaz brez `ascAppId` od mene zahteval sejo Apple Developer, ki poteče. Odkar je številka v `eas.json`, pošiljanje ne zahteva ničesar več.

> `ascAppId` dodaj pred buildom, ne po njem. Do SDK 57 [prstni odtis, ki ga izračuna Expo](https://github.com/expo/expo/blob/main/packages/@expo/fingerprint/src/sourcer/Expo.ts), vedno vključuje `eas.json`. Pri Vigie, katere različica izvajalnega okolja sledi politiki `fingerprint`, je dodajanje te številke po buildu spremenilo prstni odtis: posodobitev, objavljena pozneje, ne bi nikoli dosegla nameščenega builda. Od SDK 58 privzeta nastavitev prstnega odtisa, `balanced`, ignorira `eas.json`, piše v [Expovem dnevniku sprememb](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.«

Tvoj profil ne vsebuje ključa in EAS nima nobenega, povezanega s tvojo aplikacijo. [Expo pojasnjuje](https://docs.expo.dev/submit/ios/): v neinteraktivnem načinu te ukaz ne more vprašati za ključ, zato ne uspe s tem sporočilom.

Dve možni rešitvi:

- **Naj EAS ustvari in hrani ključ.** Enkrat zaženi `eas credentials --platform ios` v interaktivnem načinu na svojem računalniku in pusti, da za tvojo aplikacijo nastavi ključ API za App Store Connect.
- **Prinesi svoj ključ** v `ascApiKeyPath`, `ascApiKeyIssuerId` in `ascApiKeyId`. Po [referenci eas.json](https://docs.expo.dev/eas/json/) ta tri polja sprejemajo okoljske spremenljivke, kot je `$ASC_API_KEY_PATH`.

Pri moji zadnji aplikaciji je možnost `--auto-submit` zahtevala Applov ID, da bi ustvarila svoj ključ za pošiljanje. Tri polja svojega ključa sem vpisal v profil v svoji delovni kopiji, ki je nikoli nisem commital. Nato sem dokončani build poslal z `--id` in `--non-interactive`.

### »EXPO_APPLE_APP_SPECIFIC_PASSWORD must be in the format xxxx-xxxx-xxxx-xxxx, where x is a lowercase letter.«

Spremenljivka vsebuje nekaj drugega kot geslo za aplikacijo, pogosto kar tvoje Applovo geslo. [EAS CLI](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/src/submit/ios/IosSubmitCommand.ts) ta format preveri pred vsakim pošiljanjem.

Po [Applovi pomoči](https://support.apple.com/en-us/102654) geslo za aplikacijo ustvariš na account.apple.com, v razdelku App-Specific Passwords, z vklopljenim dvostopenjskim preverjanjem. Prekliče se, takoj ko spremeniš geslo svojega Applovega računa. **Expo ocenjuje to metodo kot [manj varno od ključa API](https://github.com/expo/fyi/blob/main/apple-app-specific-password.md), ki je njegova privzeta in priporočena metoda.**

## Napake Applovega računa

### »… agree to the latest Program License Agreement in your developer account.«

Celotno sporočilo se začne z »You currently don't have access to this membership resource«. Na Applovi strani lahko surov odgovor vsebuje »Unable to process request - PLA Update available«. Novejši koraki pošiljanja v EAS prikažejo raje »A required Apple agreement is missing or has expired«.

Vzrok je isti: Apple je posodobil pogodbo in je nihče ni sprejel. **Pogodbe lahko sprejme samo imetnik računa, Account Holder**, piše v [Applovi tabeli vlog](https://developer.apple.com/help/account/access/roles/). [Koda EAS](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/utils/ios/AscApiClient.ts) ga napoti na stran Business v App Store Connect, nato pa, če Apple to ponudi, še v njegov račun na developer.apple.com. Potem ukaz zaženi znova. Pogodba za plačljive aplikacije ima svoj vodnik: [Paid Apps Agreement v App Store Connect](https://devoria.fr/sl/blog/paid-apps-agreement-statusi-w-8ben-prvo-izplacilo).

### »App Store Connect rejected the API authentication credentials.«

Apple je odgovoril z napako 401, `NOT_AUTHORIZED`. [EAS](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/utils/ios/AscApiClient.ts) navaja tri vzroke: ključ ni več aktiven, ključ pripada drugemu računu App Store Connect, ali pa so Key ID, vsebina ključa ali Issuer ID napačni.

Oba identifikatorja preveri v App Store Connect, v meniju Users and Access, zavihek Integrations. Po [Applu](https://developer.apple.com/documentation/appstoreconnectapi/generating-tokens-for-api-requests) je Issuer ID prikazan na vrhu strani, Key ID pa na seznamu aktivnih ključev. **Preklicanega ključa ni mogoče nikoli več aktivirati.** [Apple ga prikazuje](https://developer.apple.com/documentation/appstoreconnectapi/revoking-api-keys) 30 dni pod Revoked: ustvariti moraš novega.

### »App Store Connect app for application identifier … was not found.«

Strani, na katero kaže `ascAppId`, s tvojim ključem ni mogoče najti. [EAS](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/utils/ios/AscApiUtils.ts) te prosi, da preveriš to številko in da ima ključ res dostop do aplikacije v pravem računu. Navede celo nekaj aplikacij, vidnih s tem ključem. Z Applovimi orodji za pošiljanje se ista težava prikaže kot »No suitable application records were found«.

Ponavljajo se trije vzroki, dva od njih sta omenjena v [tej niti Applovih forumov](https://developer.apple.com/forums/thread/106806):

- **Stran ne obstaja.** Ustvari jo v App Store Connect ali odstrani `ascAppId`, da jo ustvari ukaz.
- **Številka je iz drugega računa.** Kopiral si `ascAppId` druge ekipe ali drugega projekta.
- **Uporabnik nima dostopa do aplikacije.** App Manager ali Developer je lahko omejen na določene aplikacije. Ključ ekipe pa [ima dostop do vseh aplikacij](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api) v računu.

### »… is not available to team« ali »… is not available to provider«

To sporočilo se pojavi, ko EAS ustvari stran namesto tebe, ker ni `ascAppId`. Identifikator bundla je že zasedla druga ekipa. [EAS te prosi](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/src/credentials/ios/appstore/ensureAppExists.ts), da ga spremeniš v konfiguraciji aplikacije in ukaz zaženeš znova.

### »App name "…" is already taken. Using generated name "…"«

To ni neuspeh. Ko je ime v App Storu že zasedeno, EAS doda šest naključnih znakov in poskusi znova, največ petkrat. Stran boš pozneje preimenoval v App Store Connect. Da se temu izogneš, pred prvim pošiljanjem v profilu izpolni `appName` in `language`: brez `language` je [glavni jezik `en-US`](https://docs.expo.dev/eas/json/).

## Napake binarke: kode ITMS

Po pošiljanju Apple build obdela. Če ga zavrne, dnevnik navede eno ali več kod ITMS. Tukaj so tiste, ki jih [korak pošiljanja v EAS](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/functions/uploadToAsc.ts) prepozna in prevede:

| Koda ITMS                  | Kaj Apple zavrne                          | Rešitev                |
| -------------------------- | ----------------------------------------- | ---------------------- |
| 90189                      | Številka builda je že zasedena            | `autoIncrement`        |
| 90062, 90186, 90478        | Različica je zaprta ali že presežena      | Zvišaj `version`       |
| 90683                      | Manjka besedilo za dovoljenje             | `ios.infoPlist`        |
| 90725                      | Prestar SDK za iOS                        | Slika iOS ali SDK Expo |
| 90054, 90055               | Bundle se ne ujema s ciljno stranjo       | Popravi `ascAppId`     |
| 90022, 90023, 90391, 90713 | Ikone manjkajo ali so napačno navedene    | Preglej ikone          |
| 90771                      | Manjkajo identifikatorji opravil v ozadju | `ios.infoPlist`        |

Tri pojasnila iz teh sporočil:

- **Številka builda je edinstvena za vsako različico.** Za 90189 EAS priporoča `"autoIncrement": true` v `eas.json`. Vse je v [številka builda in različica](https://devoria.fr/sl/blog/app-store-connect-build-number-verzija-stevilka-builda).
- **Za 90725** EAS svetuje, da v `eas.json` izbereš novejšo sliko iOS in po potrebi preideš na podprt SDK Expo.
- **Za 90771** tvoj Info.plist navaja način delovanja v ozadju `processing`, ne pa ključa `BGTaskSchedulerPermittedIdentifiers`.

Razen pri 90054 in 90055, kjer je dovolj, da ciljaš pravo stran ali drug build, **rešitev zadeva binarko: naredi nov build in ga pošlji znova.** Dve kodi imata svoj vodnik: [ITMS-90683 z Expo](https://devoria.fr/sl/blog/itms-90683-missing-purpose-string-expo) in [ITMS-90725](https://devoria.fr/sl/blog/itms-90725-sdk-version-issue-expo).

Konec septembra 2026 je bil build aplikacije Solys ob dostavi zavrnjen zaradi ITMS-90683. Med čiščenjem konfiguracijske datoteke sem odstranil besedilo za dovoljenje za fotografije. Solys fotografij ne uporablja, vendar knjižnica v projektu kliče API Photos v iOS. **Apple analizira binarko, ne dejanske uporabe:** od takrat teh besedil nikoli več ne odstranjujem.

Status Missing Compliance pa ni napaka pošiljanja. Manjka tvoja izjava o šifriranju, ki je razložena v [vodniku za objavo z EAS](https://devoria.fr/sl/blog/eas-submit-ios-objava-aplikacije-expo-app-store).

## Moj kontrolni seznam pred vsakim pošiljanjem

- `ascAppId` je v profilu `submit`, dodan pred buildom.
- Ključ API upravlja EAS, ali pa njegova tri polja kažejo na `.p8`, shranjen zunaj repozitorija.
- Account Holder je v App Store Connect sprejel najnovejše pogodbe.
- `autoIncrement` je vklopljen, skupaj z `"appVersionSource": "remote"`, ki ga [Expo priporoča](https://docs.expo.dev/build-reference/app-versions/) od EAS CLI 12.
- `version` je višja od zadnje odobrene različice.
- Vsak občutljiv API v binarki ima svoje besedilo za dovoljenje.
- Pri novi aplikaciji sta `appName` in `language` izpolnjena pred prvim pošiljanjem.

## Pošlji svojo prvo aplikacijo, ne da bi obtičal

Ukaz je le en korak. [iOS & Android Kit](https://devoria.fr/sl/kits/ios) izhaja iz začetne kode mojih aplikacij, vključno z naročninami, in te v štirih korakih pripelje do App Stora, v tvojem tempu.

Če pripravljaš svojo prvo izdajo, [opravi brezplačno diagnozo](https://devoria.fr/sl/diagnostic): pove ti, kaj te v resnici zavira, in ti pošlje moj kontrolni seznam proti Applovim zavrnitvam. Za stran aplikacije, posnetke zaslona in odobritev stran [objava aplikacije v App Store](https://devoria.fr/sl/expertise/objava-aplikacije-v-app-store) obdela vsak korak.

## Pogosta vprašanja

### Zakaj eas submit ne uspe samo v neprekinjeni integraciji?

V načinu `--non-interactive` te ukaz ne more ničesar vprašati. Potrebuje `ascAppId` v profilu in ključ API, ki je že povezan z aplikacijo, ali njegova tri polja v `eas.json`. Na tvojem računalniku bi ti ta vprašanja zastavil.

### Ali moram po napaki eas submit narediti nov build?

Samo če Apple zavrne binarko s kodo ITMS. Izjema: pri ITMS-90054 in 90055 je build ciljal napačno stran, zato ga je dovolj poslati na pravo. Napake konfiguracije in računa odpraviš v `eas.json`, v App Store Connect ali v svojem Applovem računu. Nato pošlješ isti build, na primer z `--latest` ali `--id`.

### Kje vidim dnevnike pošiljanja EAS Submit?

Na strani oddaje, v Expovi nadzorni plošči. Expo svetuje, da tam prebereš dnevnike in oblaček »Build Annotations«. V terminalu dodaj `--verbose`, da se dnevniki vedno prikažejo.

### Ali lahko eas submit uporabljam z brezplačnim Applovim računom?

Ne. Expo za pošiljanje aplikacije v App Store zahteva plačljiv račun Apple Developer. Brezplačni račun omogoča testiranje na tvojem iPhonu, ne pa uporabe App Store Connect.

### Kakšno vlogo naj dam ključu API za eas submit?

Expov vodnik ključu dodeli vlogo Admin. Po Applovi tabeli vlog je pošiljanje buildov odprto tudi vlogama App Manager in Developer. Moji buildi Expo tečejo s ključem ekipe z vlogo App Manager. Ključ ekipe lahko ustvarita samo Account Holder in Admini.

### Kaj pomeni »Increment Build Number« v EAS?

Apple je build zavrnil s kodo ITMS-90189: ta številka builda za to različico že obstaja. Vklopi `"autoIncrement": true` v `eas.json` ali zvišaj `ios.buildNumber`, nato naredi nov build.


## Tvoj projekt

[Review Kit](https://devoria.fr/sl/kits/app-review): Moj kontrolni seznam za pregled v App Store, moje popravljene zavrnitve Applea, seznam za Google Play in trije skilli za Claude Code. 49 €.

[iOS & Android Kit](https://devoria.fr/sl/kits/ios): Ustvari svojo aplikacijo za iPhone in Android s Claude Code: začetna koda mojih aplikacij, pot do trgovin in vsi kompleti. 99 €.

[Diagnoza: kaj te loči od tvoje aplikacije za iPhone](https://devoria.fr/sl/diagnostic): 7 vprašanj, 60 sekund: izveš, kaj te zares ovira pri objavi aplikacije za iPhone, dobiš pot v 4 korakih in komplet, ki ti ustreza.
