# eas submit iOS hataları ve çözümleri

> eas submit başarısız mı oluyor? EAS ve App Store Connect'in gerçek mesajları, nedenleri ve çözümleri: ascAppId, API anahtarı, Apple sözleşmesi, ITMS kodları.

Orijinal sayfa: [eas submit iOS hataları ve çözümleri](https://devoria.fr/tr/blog/eas-submit-ios-hatalari-cozumleri)
Yazar: [Mehdi Azizi](https://devoria.fr/tr/mehdi-azizi)
Yayın: 2026-11-04
İçeriğin son gözden geçirilmesi: 2026-11-04


`eas submit --platform ios` başarısız olduğunda mesaj neredeyse her zaman nereye bakman gerektiğini söyler. **Ya EAS yapılandırman eksiktir, ya Apple hesabın engel çıkarıyordur, ya da Apple binary'yi reddediyordur.** İlk iki durum yeni bir build gerektirmeden birkaç dakikada düzelir. Üçüncüsü bir ITMS kodundan tanınır ve neredeyse her zaman yeni bir build ister.

Solys, TradaZen ve Nolera dahil iOS uygulamalarımı Expo ve EAS ile yayınlıyorum. Burada alıntılanan mesajlar, 3 Kasım 2026'da tekrar okuduğum [Expo'nun resmi GitHub deposundaki](https://github.com/expo/eas-cli) EAS CLI kaynak kodundan kopyalandı. Expo'nun eski forumu artık Discord'a yönlendiriyor: en güvenilir kaynak hâlâ kod. `eas.json` dosyasından incelemeye göndermeye kadar tüm süreç için önce [EAS Submit iOS: bir Expo uygulamasını App Store'da yayınlamak](https://devoria.fr/tr/blog/eas-submit-ios-expo-app-store-yayinlama) yazısını oku. Burada tamir ediyoruz.

## eas submit ne yapar ve neye ihtiyaç duyar

[Expo dokümantasyonuna](https://docs.expo.dev/deploy/submit-to-app-stores/) göre komut, `.ipa` dosyanı App Store Connect'e gönderir. Build, Apple işledikten sonra TestFlight'ta görünür, genelde 10 ila 15 dakika içinde. **Uygulamanı incelemeye göndermez**: bu adımı App Store Connect'te senin yapman gerekir.

[Expo'nun iOS gönderim sayfası](https://docs.expo.dev/submit/ios/) üç ön koşul sıralar:

- App Store'a her gönderim için şart olan **ücretli bir Apple Developer hesabı**;
- `ios.bundleIdentifier` içinde **bundle kimliği**;
- Expo hesabına bağlı, **kurulu bir EAS CLI**.

Etkileşimsiz gönderim için aynı sayfa iki ayar daha ekler:

- `eas.json` dosyasındaki `submit` profilinde **`ascAppId`**, yani App Store Connect kaydının numarası;
- EAS'in yönettiği ya da senin sağladığın **bir App Store Connect API anahtarı**. Oluşturulması, rolü ve iptali [App Store Connect API anahtarı (.p8)](https://devoria.fr/tr/blog/app-store-connect-api-anahtari-p8-olusturma) yazısında anlatılıyor.

Minimal profil birkaç satırdan ibaret. Değer temsilidir:

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

EAS API anahtarını zaten saklıyorsa bu profil yeterli. Uygulamalarımın çoğunda durum bu.

## Mesajı okumak: üç hata ailesi

Çözüm aramadan önce komutun nerede durduğunu bul. Bu tablo, her başarısızlıkta uyguladığım tablo.

| Başarısızlık anı                   | Aile               | Yeni build?         |
| ---------------------------------- | ------------------ | ------------------- |
| Herhangi bir gönderimden önce      | EAS yapılandırması | Hayır               |
| Apple'a bağlanma, kayıt oluşturma  | Apple hesabı       | Hayır               |
| Gönderimden sonra, ITMS-90xxx kodu | Reddedilen binary  | Neredeyse her zaman |

Ayrıntılar Expo panelinde, gönderimin sayfasında okunur. [Expo, orada](https://docs.expo.dev/deploy/submit-to-app-stores/) logları okumayı ve yaygın hata nedenlerini gösteren "Build Annotations" kutucuğuna bakmayı öneriyor. Terminalde, [EAS CLI referansına](https://docs.expo.dev/eas/cli/) göre `--verbose` seçeneği EAS Submit loglarını her zaman gösterir.

## EAS yapılandırma hataları

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

Komutu `--non-interactive` ile çalıştırdın (örneğin CI'da) ve profilinde `ascAppId` yok. [EAS CLI kodu](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/src/submit/ios/IosSubmitCommand.ts) bu durumda durur: ne sana soru sorabilir ne de kaydı senin yerine oluşturabilir.

**Çözüm: kaydının numarasını `ascAppId` alanına kopyala.** [Expo nerede bulunacağını gösteriyor](https://github.com/expo/fyi/blob/main/asc-app-id.md): App Store Connect'te uygulamanı aç, sonra App Information. General Information altındaki Apple ID alanı, yaklaşık on haneli bir sayı. Bu ne Apple e-posta adresin ne de bundle kimliğin.

Nolera'da `ascAppId` yokken komut benden süresi dolan bir Apple Developer oturumu istiyordu. Numara `eas.json` içine girdiğinden beri gönderim hiçbir şey sormuyor.

> `ascAppId` alanını build'den önce ekle, sonra değil. SDK 57'ye kadar [Expo'nun hesapladığı fingerprint](https://github.com/expo/expo/blob/main/packages/@expo/fingerprint/src/sourcer/Expo.ts) her zaman `eas.json` dosyasını içerir. Runtime sürümü `fingerprint` politikasını izleyen Vigie'de, bu numarayı bir build'den sonra eklemek fingerprint'i değiştirdi: sonradan yayınlanan bir güncelleme kurulu build'e asla ulaşmayacaktı. [Expo'nun sürüm notlarına](https://github.com/expo/expo/blob/main/packages/@expo/fingerprint/CHANGELOG.md) göre SDK 58'den beri varsayılan fingerprint ön ayarı olan `balanced`, `eas.json` dosyasını yok sayıyor.

### "App Store Connect API Keys cannot be set up in --non-interactive mode."

Profilinde anahtar yok ve EAS'te uygulamana bağlı bir anahtar da yok. [Expo'nun belirttiği gibi](https://docs.expo.dev/submit/ios/), etkileşimsiz modda komut senden anahtar isteyemez ve bu mesajla başarısız olur.

İki olası çözüm:

- **Anahtarı EAS oluştursun ve saklasın.** Kendi makinende, etkileşimli modda bir kez `eas credentials --platform ios` çalıştır ve uygulaman için bir App Store Connect API anahtarı yapılandırmasına izin ver.
- **Kendi anahtarını getir**: `ascApiKeyPath`, `ascApiKeyIssuerId` ve `ascApiKeyId` alanlarına. [eas.json referansına](https://docs.expo.dev/eas/json/) göre bu üç alan `$ASC_API_KEY_PATH` gibi ortam değişkenlerini kabul ediyor.

Son uygulamamda `--auto-submit` seçeneği, gönderim anahtarını oluşturmak için bir Apple kimliği istiyordu. Kendi anahtarımın üç alanını, asla commit edilmeyen çalışma kopyamdaki profile koydum. Sonra biten build'i `--id` ve `--non-interactive` ile gönderdim.

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

Değişken, uygulamaya özel paroladan başka bir şey içeriyor, çoğu zaman Apple parolanın kendisini. [EAS CLI](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/src/submit/ios/IosSubmitCommand.ts) bu formatı her gönderimden önce kontrol ediyor.

[Apple yardımına](https://support.apple.com/en-us/102654) göre uygulamaya özel parola, iki faktörlü kimlik doğrulama açıkken account.apple.com üzerinde, App-Specific Passwords bölümünden oluşturulur. Apple hesabının parolasını değiştirdiğin anda iptal edilir. **Expo bu yöntemi, varsayılan ve önerilen yöntemi olan [API anahtarından daha az güvenli](https://github.com/expo/fyi/blob/main/apple-app-specific-password.md) buluyor.**

## Apple hesabı hataları

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

Tam mesaj "You currently don't have access to this membership resource" ile başlar. Apple tarafında ham yanıt "Unable to process request - PLA Update available" içerebilir. EAS'in yeni gönderim adımları ise daha çok "A required Apple agreement is missing or has expired" gösterir.

Neden aynı: Apple bir sözleşmeyi güncellemiş ve kimse kabul etmemiş. [Apple'ın rol tablosuna](https://developer.apple.com/help/account/access/roles/) göre **sözleşmeleri yalnızca hesap sahibi, yani Account Holder kabul edebilir.** [EAS kodu](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/utils/ios/AscApiClient.ts) ondan App Store Connect'teki Business sayfasından, Apple sunarsa da developer.apple.com'daki hesabından geçmesini istiyor. Ardından komutu yeniden çalıştır. Ücretli uygulama sözleşmesinin kendi rehberi var: [App Store Connect'te Paid Apps Agreement](https://devoria.fr/tr/blog/paid-apps-agreement-durumlar-w-8ben-ilk-odeme).

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

Apple 401 hatasıyla, `NOT_AUTHORIZED` ile yanıt verdi. [EAS](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/utils/ios/AscApiClient.ts) üç neden sayıyor: artık aktif olmayan bir anahtar, başka bir App Store Connect hesabına ait bir anahtar ya da yanlış bir Key ID, anahtar içeriği veya Issuer ID.

İki kimliği App Store Connect'te, Users and Access menüsünde, Integrations sekmesinde kontrol et. [Apple'a](https://developer.apple.com/documentation/appstoreconnectapi/generating-tokens-for-api-requests) göre Issuer ID sayfanın üstünde, Key ID ise aktif anahtarlar listesinde görünür. **İptal edilmiş bir anahtar asla yeniden etkinleştirilemez.** [Apple onu](https://developer.apple.com/documentation/appstoreconnectapi/revoking-api-keys) 30 gün boyunca Revoked altında gösterir: yeni bir tane oluşturman gerekir.

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

`ascAppId` ile hedeflenen kayıt, anahtarınla bulunamıyor. [EAS](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/utils/ios/AscApiUtils.ts) bu numarayı ve anahtarın doğru hesapta uygulamaya gerçekten erişimi olup olmadığını kontrol etmeni istiyor. Hatta bu anahtarla görünen birkaç uygulamayı da listeliyor. Apple'ın gönderim araçlarında aynı sorun "No suitable application records were found" şeklinde görünür.

Üç neden sık tekrar ediyor, ikisi [Apple forumlarındaki bu başlıkta](https://developer.apple.com/forums/thread/106806) geçiyor:

- **Kayıt yok.** App Store Connect'te oluştur ya da komutun oluşturması için `ascAppId` alanını kaldır.
- **Numara başka bir hesaptan.** Başka bir ekibin ya da başka bir projenin `ascAppId` değerini kopyaladın.
- **Kullanıcının uygulamaya erişimi yok.** Bir App Manager veya Developer belirli uygulamalarla sınırlı olabilir. Ekip anahtarı ise hesaptaki [tüm uygulamalara erişir](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api).

### "… is not available to team" veya "… is not available to provider"

Bu mesaj, `ascAppId` olmadığı için EAS kaydı senin yerine oluşturduğunda çıkar. Bundle kimliği başka bir ekip tarafından alınmış. [EAS](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/src/credentials/ios/appstore/ensureAppExists.ts) onu uygulamanın yapılandırmasında değiştirip yeniden çalıştırmanı istiyor.

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

Bu bir hata değil. İsim App Store'da zaten alınmışsa EAS rastgele altı karakter ekleyip beş kereye kadar yeniden dener. Kaydı daha sonra App Store Connect'te yeniden adlandırırsın. Bundan kaçınmak için ilk gönderimden önce profilde `appName` ve `language` alanlarını doldur: `language` olmadan [ana dil `en-US` olur](https://docs.expo.dev/eas/json/).

## Binary hataları: ITMS kodları

Gönderimden sonra Apple build'i işler. Reddederse log bir veya birkaç ITMS kodu gösterir. İşte [EAS'in gönderim adımının](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/functions/uploadToAsc.ts) tanıyıp açıkladıkları:

| ITMS kodu                  | Apple'ın reddettiği                   | Çözüm                    |
| -------------------------- | ------------------------------------- | ------------------------ |
| 90189                      | Build numarası zaten kullanılmış      | `autoIncrement`          |
| 90062, 90186, 90478        | Kapanmış veya zaten geçilmiş sürüm    | `version` değerini artır |
| 90683                      | İzin açıklaması eksik                 | `ios.infoPlist`          |
| 90725                      | iOS SDK çok eski                      | iOS imajı veya Expo SDK  |
| 90054, 90055               | Bundle, hedeflenen kayıttan farklı    | `ascAppId` düzelt        |
| 90022, 90023, 90391, 90713 | İkonlar eksik veya hatalı tanımlanmış | İkonları gözden geçir    |
| 90771                      | Arka plan görev kimlikleri eksik      | `ios.infoPlist`          |

Bu mesajlardan çıkan üç not:

- **Build numarası her sürüm için benzersizdir.** 90189 için EAS, `eas.json` içinde `"autoIncrement": true` öneriyor. Her şey [build numarası ve sürüm](https://devoria.fr/tr/blog/app-store-connect-build-number-surum) yazısında.
- **90725 için** EAS, `eas.json` içinde daha yeni bir iOS imajı seçmeyi, gerekirse desteklenen bir Expo SDK'ya geçmeyi öneriyor.
- **90771 için** Info.plist dosyan `processing` arka plan modunu tanımlıyor ama `BGTaskSchedulerPermittedIdentifiers` anahtarını tanımlamıyor.

Doğru kaydı ya da başka bir build'i hedeflemenin yeterli olduğu 90054 ve 90055 dışında, **çözüm binary'ye dokunur: yeni bir build al, sonra yeniden gönder.** İki kodun kendi rehberi var: [Expo ile ITMS-90683](https://devoria.fr/tr/blog/itms-90683-missing-purpose-string-expo) ve [ITMS-90725](https://devoria.fr/tr/blog/itms-90725-sdk-version-issue-expo).

Eylül 2026 sonunda Solys'in bir build'i teslimde ITMS-90683 ile reddedildi. Yapılandırma dosyasını temizlerken fotoğraflarla ilgili bir izin açıklamasını silmiştim. Solys fotoğraf kullanmıyor ama projedeki bir kütüphane iOS Photos API'sini çağırıyor. **Apple gerçek kullanımı değil, binary'yi analiz ediyor:** o günden beri bu açıklamaları asla silmiyorum.

Missing Compliance durumu ise bir gönderim hatası değil. Şifrelemeyle ilgili beyanın eksik, bu da [EAS ile yayınlama rehberinde](https://devoria.fr/tr/blog/eas-submit-ios-expo-app-store-yayinlama) anlatılıyor.

## Her gönderimden önce kontrol listem

- `ascAppId`, `submit` profilinde ve build'den önce eklenmiş.
- API anahtarı EAS tarafından yönetiliyor ya da üç alanı depo dışında duran bir `.p8` dosyasını gösteriyor.
- Account Holder, App Store Connect'teki son sözleşmeleri kabul etmiş.
- `autoIncrement` aktif, EAS CLI 12'den beri [Expo'nun önerdiği](https://docs.expo.dev/build-reference/app-versions/) `"appVersionSource": "remote"` ile birlikte.
- `version`, son onaylanan sürümden büyük.
- Binary'deki her hassas API'nin izin açıklaması var.
- Yeni bir uygulama için `appName` ve `language` ilk gönderimden önce doldurulmuş.

## İlk uygulamanı takılmadan gönder

Komut sadece bir adım. [iOS Kit](https://devoria.fr/tr/kits/ios), abonelikler dahil uygulamalarımın başlangıç kodundan yola çıkıyor ve App Store'a kadar dört adımı kendi hızında takip ediyor.

İlk yayınına hazırlanıyorsan [ücretsiz teşhisini yap](https://devoria.fr/tr/diagnostic): seni gerçekte neyin engellediğini söyler ve sana Apple reddine karşı kontrol listemi gönderir. Kayıt, ekran görüntüleri ve onay için [App Store'da uygulama yayınlamak](https://devoria.fr/tr/expertise/app-storeda-uygulama-yayinlama) sayfası her adımı ele alıyor.

## Sık sorulan sorular

### eas submit neden sadece CI'da başarısız oluyor?

`--non-interactive` modunda komut sana hiçbir şey soramaz. Profilde `ascAppId` ve uygulamaya zaten bağlı bir API anahtarı, ya da `eas.json` içinde anahtarın üç alanı gerekir. Kendi makinende bu soruları sana sorardı.

### eas submit hatasından sonra yeniden build almak gerekir mi?

Yalnızca Apple binary'yi bir ITMS koduyla reddederse. İstisna: ITMS-90054 ve 90055'te build yanlış kaydı hedeflemiştir, doğru kayda yeniden göndermen yeterli. Yapılandırma ve hesap hataları `eas.json` içinde, App Store Connect'te ya da Apple hesabında düzeltilir. Sonra aynı build'i, örneğin `--latest` veya `--id` ile yeniden gönderirsin.

### EAS Submit gönderiminin loglarını nerede görürüm?

Expo panelinde, gönderimin sayfasında. Expo orada logları ve "Build Annotations" kutucuğunu okumayı öneriyor. Terminalde logları her zaman görmek için `--verbose` ekle.

### eas submit ücretsiz bir Apple hesabıyla kullanılabilir mi?

Hayır. Expo, App Store'a uygulama göndermek için ücretli bir Apple Developer hesabı şart koşuyor. Ücretsiz hesap kendi iPhone'unda test etmeni sağlar, App Store Connect'i kullanmanı değil.

### eas submit için API anahtarına hangi rolü vermeli?

Expo rehberi anahtara Admin rolünü veriyor. Apple'ın rol tablosuna göre build gönderimi App Manager ve Developer rollerine de açık. Expo build'lerim App Manager rolündeki bir ekip anahtarıyla çalışıyor. Ekip anahtarını yalnızca Account Holder ve Admin'ler oluşturabilir.

### EAS'teki "Increment Build Number" ne anlama gelir?

Apple build'i ITMS-90189 koduyla reddetti: bu build numarası bu sürüm için zaten var. `eas.json` içinde `"autoIncrement": true` ayarını aç ya da `ios.buildNumber` değerini artır, sonra yeni bir build al.


## Projen

[Review Kit](https://devoria.fr/tr/kits/app-review): App Store inceleme kontrol listem, düzelttiğim Apple retlerim, Google Play kontrol listesi ve üç Claude Code skill'i. ₺2.699.

[iOS & Android Kit](https://devoria.fr/tr/kits/ios): Claude Code ile iPhone ve Android uygulamanı yap: uygulamalarımın başlangıç kodu, mağazalara kadar giden yol ve tüm kitler. ₺5.499.

[Analiz: Seni iPhone uygulamandan ayıran ne?](https://devoria.fr/tr/diagnostic): 7 soru, 60 saniye: iPhone uygulamanı yayınlamanı asıl neyin engellediğini, 4 adımlık yolunu ve sana uygun kiti öğren.
