# EAS Submit iOS: Expo uygulamasını App Store'a yayınlama

> 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.

Orijinal sayfa: [EAS Submit iOS: Expo uygulamasını App Store'a yayınlama](https://devoria.fr/tr/blog/eas-submit-ios-expo-app-store-yayinlama)
Yazar: [Mehdi Azizi](https://devoria.fr/tr/mehdi-azizi)
Yayın: 2026-10-25
İçeriğin son gözden geçirilmesi: 2026-10-25


`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](https://docs.expo.dev/submit/ios/) takip ediyor. Mac'in yoksa tüm süreç [Mac olmadan iOS uygulaması yayınlama](https://devoria.fr/tr/blog/mac-olmadan-ios-uygulama-yayinlamak-expo-eas) 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ı](https://devoria.fr/tr/blog/apple-gelistirici-hesabi-ucreti) yazısında.
- **`ios.bundleIdentifier` içinde bir bundle identifier.** [Expo yapılandırma referansına](https://docs.expo.dev/versions/latest/config/app/) 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ı](https://developer.apple.com/help/app-store-connect/create-an-app-record/add-a-new-app) 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](https://docs.expo.dev/submit/testflight/) göre `eas submit`, ilk build'ini gönderdiğinde kaydı oluşturur. [eas.json referansına](https://docs.expo.dev/eas/json/) 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](https://developer.apple.com/support/authentication/) 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](https://github.com/expo/fyi/blob/main/apple-app-specific-password.md) 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, `production` profilini 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](https://github.com/expo/fyi/blob/main/creating-asc-api-key.md) anahtara Admin rolü veriyor.

İkinci durumda, aktif anahtarlar listesinde görünen Key ID'yi ve [Integrations sayfasının üstündeki](https://developer.apple.com/documentation/appstoreconnectapi/generating-tokens-for-api-requests) Issuer ID'yi not et. En önemlisi `.p8` dosyasını sakla: [onu yalnızca bir kez indirebilirsin](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api) 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.

```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` ve `autoIncrement`**: EAS sunucuları build numarasını tutar ve her production build'inde artırır. [Expo bu uzak modu](https://docs.expo.dev/build-reference/app-versions/) 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. `keys` klasörünü `.gitignore` dosyana 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

```bash
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ı](https://docs.expo.dev/eas/cli/) 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](https://docs.expo.dev/build/automate-submissions/) 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](https://developer.apple.com/help/app-store-connect/manage-builds/upload-builds). 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`:

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

[Apple'a göre](https://developer.apple.com/documentation/security/complying-with-encryption-export-regulations), 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](https://developer.apple.com/help/app-store-connect/reference/app-build-statuses) 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](https://devoria.fr/tr/blog/testflight-iphone-uygulama-test-etme) yazısında.

## Gönderim, incelemeye sunmak değildir

[Expo bunu açıkça yazıyor](https://docs.expo.dev/submit/introduction/): 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](https://developer.apple.com/help/app-store-connect/manage-submissions-to-app-review/submit-an-app) anlatıldığı gibi:

1. **Sürümün zorunlu meta verilerini doldur.**
2. **Sürümün Build bölümünde build'i seç.**
3. **"Add for Review" düğmesine tıkla.** Sürüm Ready for Review durumuna geçer, ama henüz hiçbir şey incelemeye gitmedi.
4. **"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](https://devoria.fr/tr/blog/itms-90683-missing-purpose-string-expo), [Expo ile ITMS-91053](https://devoria.fr/tr/blog/itms-91053-missing-api-declaration-expo) 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](https://devoria.fr/tr/kits/ios), 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](https://devoria.fr/tr/diagnostic): 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](https://devoria.fr/tr/expertise/app-storeda-uygulama-yayinlama) 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.


## Projen

[Apple Review Kit](https://devoria.fr/tr/kits/review-apple): Kullandığım App Store inceleme kontrol listesi, düzelttiğim Apple retleri, inceleyici notları ve uygulamanı inceleyen iki Claude Code skill'i. 29 €.

[iOS Kit](https://devoria.fr/tr/kits/ios): Claude Code ile iPhone uygulamanı yap: uygulamalarımın başlangıç kodu, işini kontrol eden skill'ler, Apple Review, Screenshots ve ASO kitleri. 129,99 €.
