EAS Submit iOS: Expo uygulamasını App Store'a yayınlama
Yazan: Mehdi Azizi
tarihinde yayınlandı, 8 dk.
EAS Submit, iOS build'ini App Store Connect'e gönderir ve build TestFlight'a düşer. İncelemeye gönderme işi App Store Connect'te sana kalır.
eas submit --platform ios, iOS build'ini App Store Connect'e gönderir. Apple işlemeyi bitirince build TestFlight'ta görünür. Komut uygulamanı Apple incelemesine göndermez: build'i seçmek ve incelemeye göndermek App Store Connect'te sana kalır. Bunu otomatikleştirmek için komutun uygulama kaydının numarasına (ascAppId) ve bir App Store Connect API anahtarına ihtiyacı var.
Solys, TradaZen ve Nolera dahil iOS uygulamalarımı Expo, EAS Build ve EAS Submit ile yayınlıyorum. Bu rehber, 25 Ekim 2026'da tekrar okuduğum Expo'nun iOS gönderim dokümantasyonunu takip ediyor. Mac'in yoksa tüm süreç Mac olmadan iOS uygulaması yayınlama yazısında. Burada sadece gönderime odaklanıyoruz.
İlk komuttan önce neye ihtiyacın var
Expo üç ön koşul sayıyor:
- Ücretli bir Apple Developer hesabı. Fiyat ve kayıt Apple geliştirici hesabı yazısında.
ios.bundleIdentifieriçinde bir bundle identifier. Expo yapılandırma referansına göre bunu sen uydurursun, ama App Store'da benzersiz olmalı.- Kurulu EAS CLI, ardından Expo hesabınla
eas login.
İmzalı bir production build'ine de ihtiyacın var. EAS Build bunu senin yerine yönettiği sertifika ve profille üretir, iOS sertifikası ve provisioning profile yazısında anlattığım gibi.
App Store Connect kaydı: sen mi, EAS mi?
EAS Submit, binary'yi App Store Connect'te var olması gereken bir uygulamaya gönderir.
Kaydı kendin oluşturabilirsin. Apple'ın yardım sayfası New App penceresini anlatıyor: platform, ad, birincil dil, bundle identifier, SKU ve kullanıcı erişimi. Account Holder, Admin ya da App Manager rolü gerekiyor.
EAS de ilk gönderimde oluşturabilir. Expo'nun TestFlight sayfasına göre eas submit, ilk build'ini gönderdiğinde kaydı oluşturur. eas.json referansına göre ascAppId doldurulursa bu adım atlanır. Ad appName alanından, o yoksa yapılandırmandaki name alanından gelir. Birincil dil language alanından gelir ve varsayılanı en-US. Uygulaman önce Fransızca çıkacaksa, bu ilk gönderimden önce language alanını doldur.
Sonra kaydın numarasını ascAppId alanına kopyala. Expo nerede bulacağını söylüyor: uygulamanı App Store Connect'te aç, sonra App Information. General Information altındaki Apple ID alanı. Bu bir sayı, bundle identifier'ın değil.
Neden Apple kimliği yerine API anahtarı
EAS Submit Apple'a Apple kimliğinle ya da bir App Store Connect API anahtarıyla bağlanır.
Apple kimliği iki faktörlü doğrulamaya takılır. Apple bunu tüm App Store Connect kullanıcılarından istiyor: girişi onaylayacak bir insan gerekir. EXPO_APPLE_APP_SPECIFIC_PASSWORD ile verilen uygulamaya özel parola bu adımı atlatır, ama Expo bunu varsayılan ve önerilen yöntemi olan API anahtarından daha az güvenli buluyor. Anahtar hiçbir etkileşim olmadan kimlik doğrulamayı, dolayısıyla gönderimi otomatikleştirmeyi sağlar.
Anahtarı almanın iki yolu var:
- Bırak EAS yönetsin.
eas credentials --platform iosçalıştır,productionprofilini seç, Apple hesabına giriş yap, sonra "App Store Connect: Manage your API Key" seçeneğini seç. - Kendi anahtarını getir. App Store Connect'te: Users and Access, Integrations sekmesi, App Store Connect API, Team Keys, sonra Generate API Key. Admin hesabı gerekiyor ve Expo'nun rehberi anahtara Admin rolü veriyor.
İkinci durumda, aktif anahtarlar listesinde görünen Key ID'yi ve Integrations sayfasının üstündeki Issuer ID'yi not et. En önemlisi .p8 dosyasını sakla: onu yalnızca bir kez indirebilirsin ve Apple hiçbir kopyasını tutmaz.
Apple'a göre Admin anahtarı hesabındaki kullanıcıları oluşturup silebilir. Apple, anahtarın asla bir kod deposuna konmamasını istiyor.
Kopyalayabileceğin minimal eas.json dosyası
Tüm değerler sahte: kendi değerlerinle değiştir.
{
"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"
}
}
}
}
appVersionSourceveautoIncrement: EAS sunucuları build numarasını tutar ve her production build'inde artırır. Expo bu uzak modu EAS CLI 12'den beri öneriyor.ascAppId: uygulama kaydının numarası. Bu olmadan etkileşimsiz mod başarısız olur.appleTeamId: Apple Developer ekibinin kimliği.ascApiKeyPath,ascApiKeyIssuerId,ascApiKeyId: API anahtarın. Üç alan da ortam değişkeni kabul ediyor.keysklasörünü.gitignoredosyana ekle.
appleId alanı yalnızca Apple kimliğinle bağlanıyorsan işe yarar. Anahtarını zaten EAS yönetiyorsa üç ascApiKey alanını da kaldır. 25 Ekim'de tekrar baktığım üç uygulamamda production gönderim profili yalnızca ascAppId içeriyor, Solys'te bir de appleTeamId: dosyada hiç anahtar yok.
Build'i, ardından gönderimi başlat
eas build --platform ios --profile production
eas submit --platform ios
Başka seçenek vermezsen eas submit gönderilecek build'i seçtirir ve ilk çalıştırmada Apple kimliğini sorar. production gönderim profili varsa varsayılan olarak o kullanılır. EAS CLI referansı seçim yapmayı gereksiz kılan seçenekleri listeliyor:
| Seçenek | Ne yapar |
|---|---|
--latest | Son iOS build'ini gönderir |
--id | Belirli bir EAS build'ini gönderir |
--path | Yerel bir .ipa dosyası gönderir |
--url | Çevrimiçi bir arşiv gönderir |
--groups | Dahili bir gruba ekler |
--what-to-test | "What to test" alanını doldurur |
Hepsini zincirlemek için build komutuna --auto-submit ekle. Expo'nun otomatik gönderim sayfasına göre biten build, build profiliyle aynı adı taşıyan gönderim profiliyle EAS Submit'e gider. Başka birini seçmek için: --auto-submit-with-profile=ad. Build TestFlight'a gider, incelemeye değil.
Sürekli entegrasyonda --non-interactive ve bir EXPO_TOKEN jetonu ekle. Komut o zaman sana hiçbir şey soramaz: profilde ascAppId ve bir API anahtarı gerekir. Bu, EAS'in uygulamaya bağladığı anahtar ya da üç ascApiKey alanındaki kendi anahtarın olabilir.
Gönderimden sonra ne oluyor
1. Apple build'i işler. Build, App Store Connect'te görünmeden önce bu işlemden geçmek zorunda ve Apple sonunda sana e-posta gönderir. Expo, TestFlight'ta görmeden önce genelde 10 ila 15 dakikadan bahsediyor.
2. İhracat uyumluluğu. Missing Compliance durumu, şifrelemeyle ilgili beyanının eksik olduğu anlamına gelir. App Store Connect bu soruları her yeni sürümde sorar, Info.plist zaten yanıtlamıyorsa. Expo'da anahtarın adı ios.config.usesNonExemptEncryption:
{
"expo": {
"ios": {
"config": {
"usesNonExemptEncryption": false
}
}
}
}
Apple'a göre, kütüphaneler dahil uygulaman hiç şifreleme ya da yalnızca muaf şifreleme kullanıyorsa false uygundur. URLSession üzerinden HTTPS gibi sistem şifrelemesi genelde muaftır. false değerini yalnızca uygulaman için doğruysa beyan et: beyan seni bağlar. Info.plist'teki her anahtar gibi bu da yeni bir build ister.
3. TestFlight. Apple'a göre Ready to Submit durumunda build dahili test kullanıcılarına gidebilir, harici test kullanıcıları için beta incelemesinden geçebilir ya da App Store incelemesine gidebilir. Profildeki groups alanı build'i dahili gruplarına ekler. Gerisi uygulamanı TestFlight ile test etme yazısında.
Gönderim, incelemeye sunmak değildir
Expo bunu açıkça yazıyor: bir TestFlight build'i App Store'da otomatik olarak yayınlanmaz. EAS Submit ne mağaza sayfanı ne de ekran görüntülerini doldurur. App Store Connect'te dört adım kalıyor, Apple'ın incelemeye gönderme yardım sayfasında anlatıldığı gibi:
- Sürümün zorunlu meta verilerini doldur.
- Sürümün Build bölümünde build'i seç.
- "Add for Review" düğmesine tıkla. Sürüm Ready for Review durumuna geçer, ama henüz hiçbir şey incelemeye gitmedi.
- "Submit for Review" düğmesine tıkla. İnceleme başladığında durum In Review olur.
Sık görülen hatalar ve çözümleri
| Görünen hata | Neden | Çözüm |
|---|---|---|
| ITMS-90189 | Build numarası zaten kullanıldı | autoIncrement |
| ITMS-90062 ou 90186 | Sürüm zaten kapandı | version değerini artır |
| "Set ascAppId" | CI'da ascAppId yok | ascAppId ekle |
| "API Keys cannot" | Bağlı anahtar yok | eas credentials |
| ITMS-90683 | Açıklama metni eksik | ios.infoPlist |
| ITMS-91053 | Manifest eksik | ios.privacyManifests |
| ITMS-90725 | iOS SDK'sı çok eski | Expo SDK'sını yükselt |
| Missing Compliance | Şifreleme beyan edilmedi | usesNonExemptEncryption |
Expo'ya göre zaten kullanılmış build numarası, gönderimde reddedilmenin yaygın bir nedeni: hepsi build numarası ve sürüm yazısında. Üç hatanın kendi rehberi var: Expo ile ITMS-90683, Expo ile ITMS-91053 ve ITMS-90725.
Tırnak içindeki iki mesaj EAS'ten geliyor ve onun yapılandırmasında düzeltiliyor. Missing Compliance, App Store Connect'teki soruları yanıtlayarak da çözülür. Diğer tüm satırlarda çözüm binary'yi etkiler: yeni bir build al, sonra tekrar gönder. Uzaktan güncelleme ne Info.plist'i ne manifesti ne de numaraları değiştirir.
İlk uygulamanı deneme yanılma olmadan gönder
Komut sadece bir adım. iOS Kit, aboneliklerle birlikte uygulamalarımın başlangıç kodundan yola çıkıyor ve App Store'a kadar dört adımı kendi hızında takip ettiriyor.
İlk yayınına hazırlanıyorsan ücretsiz teşhisini yap: seni gerçekte neyin durdurduğunu söyler ve Apple ret karşıtı kontrol listemi gönderir. Mağaza sayfası, ekran görüntüleri ve onay için App Store'da uygulama yayınlama sayfası her adımı kapsıyor.
Sık sorulan sorular
Expo uygulaması App Store'a nasıl yayınlanır?
EAS Build ile bir production build'i başlat, sonra eas submit --platform ios ile gönder. Apple işlemeyi bitirince build TestFlight'ta görünür. Ardından App Store Connect'te mağaza sayfasını doldur, sürümde bu build'i seç, sonra "Add for Review" ve "Submit for Review" düğmelerine tıkla.
EAS Submit uygulamamı Apple incelemesine gönderir mi?
Hayır. EAS Submit binary'yi App Store Connect'e gönderir ve build TestFlight'a düşer. İncelemeye gönderme, mağaza sayfası doldurulup build seçildikten sonra App Store Connect'te elle yapılır.
Uygulamamın ascAppId'si nerede?
App Store Connect'te uygulamanı aç, sonra App Information. General Information altındaki Apple ID alanı. Bu bir sayı, bundle identifier ile karıştırma.
eas submit kullanmak için Apple kimliği gerekir mi?
İlk çalıştırmada komut onu sorar. Sonrasında profilde ascAppId ve bir App Store Connect API anahtarı varsa, sürekli entegrasyonda bile etkileşimsiz çalışabilir. API anahtarı Expo'nun varsayılan ve önerilen yöntemi.
Build'i TestFlight'ta görmek ne kadar sürer?
Expo genelde Apple tarafında 10 ila 15 dakikalık işlemeden bahsediyor ve Apple sonunda sana e-posta gönderiyor. Build Missing Compliance durumunda kalırsa şifreleme sorularını yanıtla, sonra sonraki build'ler için bunu yapılandırmanda beyan et.