# App Store Connect build number: sürüm ve build numarası

> Sürüm, müşterilerinin gördüğü numaradır; build number ise her yüklemeyi tanımlar. İkili benzersiz olmalı, Expo'da EAS build numarasını senin için artırır.

Orijinal sayfa: [App Store Connect build number: sürüm ve build numarası](https://devoria.fr/tr/blog/app-store-connect-build-number-surum)
Yazar: [Mehdi Azizi](https://devoria.fr/tr/mehdi-azizi)
Yayın: 2026-11-04
İçeriğin son gözden geçirilmesi: 2026-11-04


App Store Connect'teki build number, yani build numarası: her yüklemeyi tanımlayan `CFBundleVersion` anahtarı. Sürüm ise, yani `CFBundleShortVersionString`, müşterilerinin App Store'da gördüğü numara. **Apple, sürüm ve build numarası ikilisinin benzersiz olmasını şart koşar: bir build numarası aynı sürüm için yalnızca bir kez kullanılır.**

Expo'da sürümü kendin belirlersin, EAS ise her production build'de build numarasını artırabilir. Bu rehber iki numarayı, Apple'ın kurallarını, ITMS-90062 ve ITMS-90189 hatalarını ve build'in görünmediğinde neyi kontrol etmen gerektiğini anlatıyor.

iOS uygulamalarımı Expo ve EAS ile yayınlıyorum, Solys, TradaZen ve Nolera da bunlardan. Aşağıda gösterdiğim ayarlar onların `eas.json` dosyalarından.

## Sürüm ve build numarası: fark ne?

Info.plist'teki iki anahtar uygulamanı tanımlar. [Apple'ın CFBundleShortVersionString dokümantasyonu](https://developer.apple.com/documentation/bundleresources/information-property-list/cfbundleshortversionstring) onu kullanıcının gördüğü sürüm olarak tanımlar: 10.14.1 gibi noktalarla ayrılmış üç tam sayı. [CFBundleVersion dokümantasyonu](https://developer.apple.com/documentation/bundleresources/information-property-list/cfbundleversion) ise build sürümünden bahseder: yalnızca rakam ve noktadan oluşan bir ile üç arası tam sayı.

| Öğe            | iOS anahtarı               | Kim görür    | Expo alanı        |
| -------------- | -------------------------- | ------------ | ----------------- |
| Sürüm          | CFBundleShortVersionString | Müşterilerin | `version`         |
| Build numarası | CFBundleVersion            | Sen ve Apple | `ios.buildNumber` |

Uydurma bir örnek: 1.4.0 sürümü için testlerin sırasında 12, 13 ve 14 numaralı build'leri gönderiyorsun, sonra inceleme için birini seçiyorsun. [App Store Connect yardımı](https://developer.apple.com/help/app-store-connect/manage-builds/upload-builds) bunu şöyle özetliyor: sürüm build'i sayfasına bağlar, build numarası onu sistemin her yerinde tanımlar.

## Apple'ın artırma kuralları

1. **İkili benzersiz olmalı.** [Xcode Cloud dokümantasyonuna](https://developer.apple.com/documentation/xcode/setting-the-next-build-number-for-xcode-cloud-builds) göre App Store Connect benzersiz bir sürüm ve build numarası kombinasyonu ister. Yani bir iPhone uygulaması yeni bir sürümde 1'den başlayabilir. Mac uygulaması başlayamaz: numarası her zaman artmalı.
2. **Onaylanmış bir sürüm kapanmıştır.** Apple 1.4.0 sürümünü onayladıktan sonra ona build ekleyemezsin. Bir sonraki sürüm daha yüksek bir numara taşımalı.
3. **Her sayı bir tam sayı gibi karşılaştırılır.** 1.10, 1.9'dan sonra gelir, çünkü 10, 9'dan büyüktür. Onaylanmış bir 1.20'den sonra gönderilen 1.9 reddedilir.

Tavsiyem: **hep artan bir tam sayı build numarası kullan, 1'e sıfırlama.** iPhone'da 1'den başlamak serbest, ama uygulamanın tüm ömrü boyunca benzersiz bir numara TestFlight'ta iki build'i karıştırmanı engeller. Uzak moddaki uygulamalarımda gördüğüm de bu: sayaç bir sürümden diğerine devam ediyor.

## Expo ve EAS ile sürüm ve build yönetimi

[Expo'nun sürümler sayfası](https://docs.expo.dev/build-reference/app-versions/), 25 Eylül 2026'da güncellendi, rolleri ayırıyor. Sürüm (app.json'daki `version`) sende kalır: yeni bir yayın hazırlarken değiştirirsin. Build numarası (`ios.buildNumber`) EAS'e bırakılabilir. Expo zaten onu artırmayı unutmayı, yükleme sırasında reddin yaygın bir nedeni olarak gösteriyor.

Her şey eas.json'da ayarlanır:

```json
{
  "cli": {
    "appVersionSource": "remote"
  },
  "build": {
    "production": {
      "autoIncrement": true
    }
  }
}
```

- **`"remote"`**: build numarasını EAS sunucuları tutar. EAS CLI 12'den beri önerilen davranış bu. Sayaç yapılandırmandaki değerden ya da 1'den başlar, sonra `ios.buildNumber` yok sayılır.
- **`"local"`**: geçerli olan senin yapılandırman. `autoIncrement` ile EAS dosyandaki `ios.buildNumber` değerini değiştirir ve her build'de bu değişikliği commit'lemen gerekir.
- **`autoIncrement`**: [eas.json referansı](https://docs.expo.dev/eas/json/) build için `true` veya `"buildNumber"`, sürümün son hanesini artırmak için `"version"` kabul eder. Expo, uzak modda `"version"` değerinin desteklenmediğini belirtiyor.

Bende TradaZen ve Nolera `remote` modunda. Solys `local` modunda kaldı: build numarası app.json'da duruyor ve her production build onu dosyada artırıyor. **İkisi de çalışır, ama uzak mod unutulmuş bir commit riskini ortadan kaldırır.**

İki komut sistemi tamamlıyor. `eas build:version:set` uzak sayacı başlatır: Apple'a gönderdiğin son numarayı gir. `eas build:version:sync` uzak değerleri projene kopyalar, bir gün Xcode ile derlersen işine yarar. EAS Update kullanıyorsan uzak mod `nativeVersion` politikasıyla çalışmaz: Expo `appVersion` öneriyor.

## ITMS-90062: sürüm zaten onaylanmış

Mesaj şuna benzer (numaralar uydurma):

```text
ERROR ITMS-90062: This bundle is invalid. The value for key
CFBundleShortVersionString [1.4.0] in the Info.plist file must
contain a higher version than that of the previously approved
version [1.4.0].
```

Apple 1.4.0 sürümünü zaten onaylamış: artık ona build ekleyemezsin. **app.json'da sürümü artır, örneğin 1.4.1 yap, sonra yeniden build al.** Sadece build numarasını değiştirmek yetmez.

`version` güncel olduğu hâlde hata tekrar ediyorsa bir `ios.version` alanı ara. [Expo yapılandırma referansına](https://docs.expo.dev/versions/latest/config/app/) göre iOS için `version` değerinin önüne geçer. Kardeş hata ITMS-90186, "Invalid Pre-Release Train", için de çözüm aynı: yeni build'lere kapanmış bir sürümü işaret eder.

## ITMS-90189: Redundant Binary Upload

Burada sorun build numarasında:

```text
ERROR ITMS-90189: Redundant Binary Upload. You've already uploaded
a build with build number '12' for version number '1.4.0'.
```

1.4.0 (12) ikilisi Apple'da zaten var. Expo'da dört neden öne çıkar:

- **Kullanılan profilde `autoIncrement` yok.** Nolera'daki gibi TestFlight için ayrı bir profil oluşturursan seçeneği oraya da ekle.
- **Uzak sayaç geride kalmış.** Elle yüklemelerden sonra `remote` moduna geçtin: Apple'daki bilinen son numarayla `eas build:version:set` çalıştır.
- **Yerel modda commit unutulmuş.** Sonraki build eski numaradan devam eder.
- **Aynı binary'yi tekrar gönderiyorsun.** `eas submit` ile eskisini değil, yeni build'i seç.

**Düzeltme her zaman aynı: daha yüksek numaralı yeni bir build.**

## "No builds available": build'in görünmüyor

Build gitti ama sayfan onu sunmuyor. Şu sırayla kontrol et.

1. **Hâlâ işleniyor.** Apple her build'i göstermeden önce işler ve bitince sana e-posta gönderir. [Expo](https://docs.expo.dev/submit/ios/) genelde 10 ila 15 dakikadan bahsediyor. [Apple'a göre](https://developer.apple.com/help/app-store-connect/manage-builds/view-builds-and-metadata) işleme 24 saati geçerse bir Feedback Assistant kaydı açmak gerekir.
2. **Şifreleme beyanını bekliyor.** Bu, aşağıda ayrıntılı anlatılan Missing Compliance durumu.
3. **Sürüm eşleşmiyor.** 1.4.1 sürümlü bir build, App Store Connect'te 1.5.0 olarak hazırlanmış bir sayfanın altına girmez. İkisini eşitle.
4. **Bu arada bir sürüm yayınlandı.** [Build seçimi yardımına](https://developer.apple.com/help/app-store-connect/manage-builds/choose-a-build-to-submit) göre liste bu durumda yalnızca o yayından sonra gönderilen build'leri gösterir.
5. **Göremeyen test kullanıcısı.** TestFlight uygulamasında "no builds available" genellikle build'in hiçbir grupta olmadığı, beta incelemesini beklediği ya da süresinin dolduğu anlamına gelir. Ayrıntılar [iPhone uygulamanı TestFlight ile test etmek](https://devoria.fr/tr/blog/testflight-iphone-uygulama-test-etme) yazısında.

### Bilmen gereken durumlar

[Apple'ın listesine](https://developer.apple.com/help/app-store-connect/reference/app-build-statuses) göre görünmeyen bir build'i en sık açıklayan durumlar. Processing ve Failed orada yer almıyor: bunlar [build takibi](https://developer.apple.com/help/app-store-connect/manage-builds/view-builds-and-metadata) sayfasında anlatılan yükleme durumları.

| Durum              | Anlamı                     | Senin düzeltmen           |
| ------------------ | -------------------------- | ------------------------- |
| Processing         | Apple build'i işliyor      | E-postayı bekle           |
| Failed             | İşleme hatası              | Hatayı oku, tekrar gönder |
| Missing Compliance | Şifreleme beyan edilmemiş  | Yanıtla veya Info.plist   |
| Invalid Binary     | Uygunsuz yükleme           | Düzelt, yeni build        |
| Expired            | 90 gün aşıldı              | Yeni build                |
| Ready to Submit    | Test veya incelemeye hazır | Bir gruba ekle            |

### Şifrelemeyi bir kerede beyan et

`ITSAppUsesNonExemptEncryption` anahtarı yoksa [Apple](https://developer.apple.com/documentation/bundleresources/information-property-list/itsappusesnonexemptencryption) her yeni sürümde uyumluluk sorularını sana sorar. Expo'da alanın adı `ios.config.usesNonExemptEncryption`:

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

`false` şu anlama gelir: şifreleme yok ya da yalnızca muaf tutulan şifreleme var. [Apple](https://developer.apple.com/documentation/security/complying-with-encryption-export-regulations), HTTPS bağlantıları gibi sisteme gömülü şifrelemenin genelde muaf olduğunu ve yanıtın kütüphanelerini de kapsadığını belirtiyor. Üç uygulamam da `false` beyan ediyor. **`false` değerini yalnızca uygulaman için doğruysa kullan: beyan seni bağlar.**

## Gönderilmiş bir build'in numarası değiştirilebilir mi?

Hayır. Numara imzalı binary'nin içine yazılıdır: düzeltmek için yeni bir build gerekir.

Değiştirebileceğin şey, sürümüne bağlı build. Apple sürüm başına tek bir build'e izin verir, ama incelemeye gönderene kadar [onu istediğin kadar değiştirebilirsin](https://developer.apple.com/help/app-store-connect/manage-builds/choose-a-build-to-submit):

1. App Store Connect'te sürümü aç, Build bölümüne git.
2. Mevcut build'in üzerine gel ve silme düğmesine, eksi işaretine tıkla.
3. Ekleme düğmesine, artı işaretine tıkla, doğru build'i seç, sonra kaydet.

Bir build'i sürümden çıkarmak onu hesabından silmez. Sürüm zaten incelemedeyse [önce gönderimi geri çek](https://developer.apple.com/help/app-store-connect/manage-submissions-to-app-review/remove-a-submission-from-review): inceleme sıfırdan başlar.

## Bir sonraki gönderiminden önce

Build numarası, yükleme sırasındaki kontrollerden sadece biri. Build imajı [ITMS-90725](https://devoria.fr/tr/blog/itms-90725-sdk-version-issue-expo) hatasını tetikleyebilir, imzalamanın da kendi tuzakları var, bunlar [iOS geliştirici sertifikası ve provisioning profile](https://devoria.fr/tr/blog/ios-gelistirici-sertifikasi-provisioning-profile-expo) yazısında anlatılıyor. Build'den TestFlight'a tüm zincir [Mac olmadan iOS uygulaması yayınlamak](https://devoria.fr/tr/blog/mac-olmadan-ios-uygulama-yayinlamak-expo-eas) yazısında, inceleme süreleri ise [App Store onay süresi](https://devoria.fr/tr/blog/app-store-onay-suresi-ne-kadar) yazısında. Tüm adımlar [App Store'da uygulama yayınlamak](https://devoria.fr/tr/expertise/app-storeda-uygulama-yayinlama) sayfasında bir arada.

İlk yayınını hazırlıyorsan [ücretsiz teşhisi yap](https://devoria.fr/tr/diagnostic): projende neyin takıldığını söyler ve sana Apple reddine karşı kontrol listemi gönderir. Uygulamayı geliştirmek, abonelikleri bağlamak ve yayınlamak için [iOS & Android Kit](https://devoria.fr/tr/kits/ios), uygulamalarımın başlangıç koduyla dört adımlık yolu kendi hızında takip ediyor.

## Sık sorulan sorular

### App Store Connect'te sürüm ile build number arasındaki fark ne?

Sürüm, yayınının herkese açık numarasıdır, 1.4.0 gibi. Build number, bu sürüm için Apple'a gönderilen belirli bir binary'yi tanımlar. Aynı sürüm için her biri kendi numarasıyla birden fazla build gönderebilirsin.

### Her gönderimde build numarasını değiştirmek gerekir mi?

Evet, aynı sürüm için. Apple aynı sürüm ve build numarası ikilisiyle ikinci bir gönderimi reddeder, bu ITMS-90189 hatasıdır. EAS'te `autoIncrement` bunu her production build'de halleder.

### Build numarası her sürümde 1'den mi başlamalı?

Zorunlu değil. iPhone'da Apple yeni bir sürüm için daha düşük bir numarayı kabul eder, çünkü yalnızca ikilinin benzersiz olması gerekir. Hep artan bir sayaç takip etmek için yine de daha basit.

### App Store Connect'te build number nasıl değiştirilir?

Gönderilmiş bir build'in numarasını değiştiremezsin. Ama sürüm incelemede olmadığı sürece, sayfanın Build bölümünden sürümüne bağlı build'i değiştirebilirsin. Yeni bir numara için yeniden build al.

### Build'im App Store Connect'te neden görünmüyor?

Çoğu zaman hâlâ işleniyordur ya da şifreleme beyanını bekliyordur. Sürümünün sayfandakiyle eşleştiğini de kontrol et. İşleme 24 saati geçerse Apple bir kayıt açmanı istiyor.


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