eas submit iOS hataları ve çözümleri
Yazan: Mehdi Azizi
tarihinde yayınlandı, 10 dk.
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ı.
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 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 yazısını oku. Burada tamir ediyoruz.
eas submit ne yapar ve neye ihtiyaç duyar
Expo dokümantasyonuna 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ı üç ön koşul sıralar:
- App Store'a her gönderim için şart olan ücretli bir Apple Developer hesabı;
ios.bundleIdentifieriç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.jsondosyasındakisubmitprofilindeascAppId, 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) yazısında anlatılıyor.
Minimal profil birkaç satırdan ibaret. Değer temsilidir:
{
"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 logları okumayı ve yaygın hata nedenlerini gösteren "Build Annotations" kutucuğuna bakmayı öneriyor. Terminalde, EAS CLI referansına 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 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: 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.
ascAppIdalanını build'den önce ekle, sonra değil. SDK 57'ye kadar Expo'nun hesapladığı fingerprint her zamaneas.jsondosyasını içerir. Runtime sürümüfingerprintpolitikası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 göre SDK 58'den beri varsayılan fingerprint ön ayarı olanbalanced,eas.jsondosyası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, 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,ascApiKeyIssuerIdveascApiKeyIdalanlarına. eas.json referansına göre bu üç alan$ASC_API_KEY_PATHgibi 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 bu formatı her gönderimden önce kontrol ediyor.
Apple yardımına 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 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 göre sözleşmeleri yalnızca hesap sahibi, yani Account Holder kabul edebilir. EAS kodu 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.
"App Store Connect rejected the API authentication credentials."
Apple 401 hatasıyla, NOT_AUTHORIZED ile yanıt verdi. EAS üç 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 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 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 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 geçiyor:
- Kayıt yok. App Store Connect'te oluştur ya da komutun oluşturması için
ascAppIdalanını kaldır. - Numara başka bir hesaptan. Başka bir ekibin ya da başka bir projenin
ascAppIddeğ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.
"… 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 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.
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 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.jsoniçinde"autoIncrement": trueöneriyor. Her şey build numarası ve sürüm yazısında. - 90725 için EAS,
eas.jsoniçinde daha yeni bir iOS imajı seçmeyi, gerekirse desteklenen bir Expo SDK'ya geçmeyi öneriyor. - 90771 için Info.plist dosyan
processingarka plan modunu tanımlıyor amaBGTaskSchedulerPermittedIdentifiersanahtarı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 ve ITMS-90725.
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 anlatılıyor.
Her gönderimden önce kontrol listem
ascAppId,submitprofilinde ve build'den önce eklenmiş.- API anahtarı EAS tarafından yönetiliyor ya da üç alanı depo dışında duran bir
.p8dosyasını gösteriyor. - Account Holder, App Store Connect'teki son sözleşmeleri kabul etmiş.
autoIncrementaktif, EAS CLI 12'den beri Expo'nun önerdiği"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
appNamevelanguageilk gönderimden önce doldurulmuş.
İlk uygulamanı takılmadan gönder
Komut sadece bir adım. iOS Kit, 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: 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 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.

