Scheme: nedir, yapılandırma ve Xcode'da çalıştırma

Yazar: IT Sectr Yayınlanma: 2026-05-30 Okuma süresi: 9 dk

Xcode'daki Scheme, iOS, macOS, watchOS veya tvOS için bir uygulamanın nasıl derleneceğini, test edileceğini, profilleneceğini ve arşivleneceğini belirleyen bir yapılandırmadır. Her Scheme, kendi parametreleri, bağımsız değişkenleri ve ortam değişkenleriyle bir dizi eylem (Build, Run, Test, Profile, Analyze, Archive) içerir. Apple Developer Documentation, 2025'e göre Scheme, Xcode'da derleme yapılandırmalarını yönetmek için ana araçtır ve manuel parametre değiştirmenin yerini alır. Xcode, proje ilk açıldığında her hedef için otomatik olarak bir şema oluşturur.

Önemli noktalar

  • Scheme, derleme, test ve arşivleme için bir dizi eylem içeren Xcode yapılandırmasıdır.
  • Build, belirli bir yapılandırmayla (Debug veya Release) hedefleri derler.
  • Run, uygulamayı bağımsız değişkenler, ortam değişkenleri ve giriş noktasıyla başlatır.
  • Test, seçilen test kümesiyle unit ve UI testlerini çalıştırır.
  • Archive, App Store'da yayınlamak için üretim yapılandırmasıyla derleme yapar.

Xcode'da Scheme nedir?

Xcode'daki Scheme, bir uygulamayı derlemek ve analiz etmek için eylem sırasını ve bunların parametrelerini açıklayan bir XML dosyasıdır (.xcscheme uzantılı). Her Scheme bir veya daha fazla hedefe bağlıdır ve her eylemin hangi yapılandırmayla (Debug, Release, AdHoc) çalıştırılacağını belirler. Scheme, Android'deki Build Variant'ın karşılığıdır, ancak daha esnek bir yapıya sahiptir: tek bir şema farklı eylemler için farklı hedefler içerebilir.

Xcode, proje ilk açıldığında her hedef için otomatik olarak bir şema oluşturur. Şemanın varsayılan adı hedefin adıyla aynıdır. Projede test hedefi varsa, Xcode onu ana hedefin şemasının Test eylemine otomatik olarak ekler. Birden çok hedefli projelerde (ana uygulama + watchOS + uzantı), Xcode her biri için ayrı bir şema oluşturur, ancak tüm hedefleri aynı anda derleyen tek bir şema da oluşturulabilir.

Şemalar xcshareddata/xcschemes/ dizininde (shared için) veya xcuserdata/<user>/xcschemes/ dizininde (private için) saklanır. Shared şemalar Git'e gider ve tüm ekip tarafından kullanılır. Private şemalar yerel olarak saklanır ve senkronize edilmez. .xcscheme dosyası, kök öğesi <Scheme> olan XML formatındadır. İçinde her eylem için bloklar bulunur: BuildAction, TestAction, LaunchAction, ProfileAction, AnalyzeAction, ArchiveAction.

.xcscheme dosyasının yapısı

.xcscheme, manuel olarak veya Xcode aracılığıyla düzenlenebilen bir XML dosyasıdır. Ana öğeler: <BuildAction> (derlenecek hedeflerin listesi), <TestAction> (test hedeflerine bağlantılar), <LaunchAction> (başlatma yapılandırması), <ProfileAction>, <AnalyzeAction>, <ArchiveAction>. Her blok, söz konusu eylem için hangi yapılandırmanın (Debug/Release) kullanılacağını belirleyen buildConfiguration özniteliğini içerir.

Scheme eylemleri: Build, Run, Test, Profile, Analyze, Archive

Scheme altı eylemden oluşur ve her biri bağımsız olarak yapılandırılabilir. Build eylemi, hangi hedeflerin hangi sırayla derleneceğini belirler. Run eylemi, uygulamanın hangi bağımsız değişkenler, ortam değişkenleri ve hangi yapılandırmayla başlatılacağını belirler. Test eylemi, hangi testlerin çalıştırılacağını ve hangi kod kapsamı seçeneklerinin etkinleştirileceğini belirler. Profile eylemi, profil çıkarmak için Instruments araçlarıyla başlatır. Analyze eylemi, Clang Static Analyzer ile statik kod analizi yapar. Archive eylemi, App Store'da yayınlamak veya AdHoc dağıtımı için derleme yapar.

Her eylem için ayrı bir build configuration ayarlanabilir. Genellikle Run ve Test için Debug, Archive için Release kullanılır. build configuration, derleyici bayrakları, optimizasyonlar ve hata ayıklama bilgileri kümesini tanımlar. Xcode iki standart yapılandırma sunar: Debug (optimizasyon yok, hata ayıklama sembolleriyle) ve Release (optimizasyonlu, hata ayıklama bilgisi yok). Geliştirici, project.xcconfig aracılığıyla özel yapılandırmalar ekleyebilir.

Archive eylemi özellikle önemlidir: bir .xcarchive oluşturur ve bu daha sonra App Store veya AdHoc için .ipa'ya dışa aktarılır. Archive eylemi varsayılan olarak Release yapılandırmasını kullanır, ancak AdHoc veya Distribution'a geçilebilir. Archive eyleminde revealArchiveInOrganizer bayrağı da vardır: arşivleme tamamlandığında Xcode, arşivle ilgili daha fazla işlem için Organizer'ı açar.

xml
<!-- iOS uygulaması için .xcscheme örneği -->
<Scheme
  LastUpgradeVersion = "1500"
  version = "1.7">

  <BuildAction
    parallelizeBuildables = "YES"
    buildImplicitDependencies = "YES">
    <BuildActionEntries>
      <BuildActionEntry
        buildForTesting = "YES"
        buildForRunning = "YES"
        buildForProfiling = "YES"
        buildForArchiving = "YES"
        buildForAnalyzing = "YES">
        <BuildableReference
          BuildableIdentifier = "primary"
          BlueprintIdentifier = "ABCD1234"
          BuildableName = "MyApp.app"
          BlueprintName = "MyApp"
          ReferencedContainer = "container:MyApp.xcodeproj">
        </BuildableReference>
      </BuildActionEntry>
    </BuildActionEntries>
  </BuildAction>

  <LaunchAction
    buildConfiguration = "Debug"
    selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
    enableAddressSanitizer = "YES">
  </LaunchAction>
</Scheme>

Scheme oluşturma ve yapılandırma

Tanılama temizleyicileri (sanitizer)

Yeni bir şema oluşturmak Xcode menüsünden yapılır: Product → Scheme → New Scheme veya Scheme panelindeki (Run düğmesinin yanındaki) "+" düğmesiyle. Oluştururken şemanın oluşturulacağı hedef seçilir. Mevcut bir şema "duplicate" olarak seçilirse, Xcode ayarlarını otomatik olarak kopyalar. Yeni şemalar varsayılan olarak private olarak kaydedilir; ekiple paylaşmak için Manage Schemes'te Shared'ı etkinleştirmek gerekir.

Edit Scheme penceresi (Product → Scheme → Edit Scheme), eylem sayısına karşılık gelen altı sekme içerir. Her sekmede build configuration, başlatma bağımsız değişkenleri, ortam değişkenleri ve tanılama bayrakları değiştirilebilir. Run sekmesinde şu seçenekler bulunur: executable (hangi ikili dosyanın başlatılacağı), wait for executable to be launched (başlatılan işlemleri hata ayıklamak için), debugger (LLDB veya None), launch arguments, environment variables ve genişletilmiş seçenekler (Address Sanitizer, Thread Sanitizer, Main Thread Checker, Memory Management).

Tanılama için Address Sanitizer (ASan), C/C++/ObjC kodunda sınır dışı erişimleri, use-after-free ve diğer bellek hatalarını algılar. Thread Sanitizer (TSan), çok iş parçacıklı kodda veri yarışlarını algılar. Undefined Behavior Sanitizer (UBSan), işaretli int taşması gibi tanımsız davranışları algılar. Bu seçenekler Edit Scheme → Run → Diagnostics altında mevcuttur ve yalnızca Debug derlemelerinde çalışır. Tüm sanitizer'ları etkinleştirmek başlatmayı 2-3 kat yavaşlatabilir, bu nedenle seçici olarak etkinleştirilmesi önerilir.

Farklı ortamlar için şemayı klonlama

Yaygın bir uygulama, her ortam için ayrı şemalar oluşturmaktır: Dev, Staging, Production. Her şema aynı Build Configuration'ı kullanır (Dev için Debug, Production için Release), ancak farklı başlatma bağımsız değişkenleri kullanır: Dev için -FIRAnalyticsDebugEnabled, -com.apple.CoreData.SQLDebug 1 ve Production için bunların olmaması. Başlatma bağımsız değişkenleri UserDefaults'a (ProcessInfo.processInfo.arguments) iletilir ve uygulama başlangıcında okunabilir. Bu, kod değiştirmeden sunucu URL'sini, günlük düzeyini ve özellikleri değiştirmeyi sağlar.

Shared ve Private şemalar: Git ile yönetim

Shared şemalar <project>.xcworkspace/xcshareddata/xcschemes/ veya <project>.xcodeproj/xcshareddata/xcschemes/ dizininde saklanır ve Git deposuna girer. Takımdaki tüm geliştiriciler bu şemaları Xcode'da görür. Shared şemalar, şemaları takım içinde dağıtmanın tek yoludur. Bir geliştirici önemli bir şema (örneğin "Staging Archive") oluşturduysa ancak Shared olarak işaretlemediyse, ekibin geri kalanı onu göremez ve bu da karışıklığa yol açar: herkes kendi ayarlarıyla kendi şemasını oluşturur.

Private şemalar xcuserdata/<user>/xcschemes/ dizininde saklanır ve Git'e girmez. Kişisel yapılandırmalar için kullanışlıdırlar: örneğin, belirli bir geliştirici için tüm sanitizer'ların etkinleştirildiği bir şema. Private şemalar, projenin derlenmesinin bağlı olduğu kritik ayarları içermemelidir; geliştirici projeden ayrılırsa private şemaları kaybolur. Öneri: CI/CD'de ve en az iki geliştirici tarafından kullanılan tüm şemaları Shared yapın.

Şema yönetimi Manage Schemes (Product → Scheme → Manage Schemes) aracılığıyla yapılır. Pencere, projedeki tüm şemaları, durumlarını (Shared/Private) ve ekleme/silme için +/− düğmelerini gösterir. Shared onay kutusu, şemanın ekip için görünürlüğünü değiştirir. Git çakışması durumunda (iki geliştiricinin .xcscheme değişikliği), birleştirme dikkatle çözülmelidir: XML dosyaları farklı hedef tanımlayıcıları içerebilir. .xcscheme'nin birleştirme sırasında kilitlenen dosyalara eklenmesi önerilir (git lfs veya .gitattributes).

Başlatma bağımsız değişkenleri ve ortam değişkenleri

Bağımsız değişkenler (arguments), Scheme'de başlatma sırasında uygulamaya iletilen dizelerdir (ProcessInfo.processInfo.arguments) ve ortam değişkenleri (ProcessInfo.processInfo.environment). Bağımsız değişkenler bayraklar için kullanılır: -AppleLanguages (ru), -AppleLocale ru_RU Rusça yerel ayarını simüle etmek için veya -FIRDebugEnabled Firebase hata ayıklamasını etkinleştirmek için. Ortam değişkenleri yapılandırma için kullanılır: API_BASE_URL=http://localhost:3000, LOG_LEVEL=debug.

Farklı ortamlarda özellikleri (feature flags) yönetmek için Arguments + Build Configuration kombinasyonu kullanılır. Dev şemasında -FeatureFlagNewOnboarding YES bağımsız değişkeni ayarlanır, Production'da ise -FeatureFlagNewOnboarding NO (veya bağımsız değişken yoktur). Kodda kontrol: UserDefaults.standard.bool(forKey: "FeatureFlagNewOnboarding"). Bu yaklaşım, kodu değiştirmeden ve üretim değerlerini commit etmeden staging'de özellikleri kademeli olarak etkinleştirmeyi sağlar.

Önemli: Scheme'nin bağımsız değişkenleri ve ortam değişkenleri Info.plist değerlerini geçersiz kılar. Info.plist'te API_URL belirtilmişse ve Scheme'de Run eylemi için API_URL=http://localhost varsa, Xcode'dan başlatıldığında Scheme'deki değer kullanılır. Bir cihazda başlatıldığında (Xcode'dan değil) — Info.plist'teki değer. Bu, yerel geliştirme için uygundur, ancak Scheme değişkenlerinin derlemeye girmediğini unutmamak gerekir: yalnızca Xcode aracılığıyla başlatıldığında etki ederler.

swift
import Foundation

struct AppEnvironment {
    var apiBaseURL: String {
        ProcessInfo.processInfo.environment["API_BASE_URL"]
            ?? Bundle.main.object(forInfoDictionaryKey: "API_BASE_URL") as? String
            ?? "https://api.production.com"
    }

    var isDebugMode: Bool {
        ProcessInfo.processInfo.arguments.contains("-DebugModeEnabled")
    }

    var isNewOnboardingEnabled: Bool {
        UserDefaults.standard.bool(forKey: "FeatureFlagNewOnboarding")
    }
}

// Başlangıçta kullanım
let env = AppEnvironment()
NetworkConfig.shared.configure(baseURL: env.apiBaseURL)

CI/CD'de Scheme: xcodebuild ile otomasyon

CI/CD'de (GitHub Actions, Jenkins, GitLab CI) Scheme, xcodebuild komutunun ana bağımsız değişkeni olarak kullanılır. Örnek: xcodebuild -workspace MyApp.xcworkspace -scheme MyApp -configuration Release -sdk iphoneos archive. -scheme bayrağı hangi şemanın kullanılacağını belirtir. xcodebuild, build configuration, hedefler ve derleme sırası dahil tüm ayarları .xcscheme dosyasından okur. Bu, CI/CD'nin uygulamayı yerel IDE ile aynı parametrelerle derlemesini garanti eder.

CI/CD için shared şemalar kritiktir. Şema Shared değilse, xcodebuild onu depoda bulamaz ve derleme "Scheme not found" hatasıyla başarısız olur. Kural: CI/CD'yi yapılandırmadan önce kullanılan tüm şemaların Shared olarak işaretlendiğinden emin olun. İkinci kural: CI/CD'de varsayılan şemayı kullanmayın (Xcode otomatik olarak ilk şemayı seçer) — şema adını her zaman -scheme bayrağıyla açıkça iletin.

Birden çok şemayı paralel derlemek için (örneğin uygulama ve watchOS uzantısı), xcodebuild sıralı veya paralel çalıştırılabilir. Modern CI sistemleri, farklı şemaların derlenmesini bir matris aracılığıyla paralelleştirmeye olanak tanır: bir iş iOS uygulamasını, ikincisi watchOS uzantısını derler. Bu, iki paralel ajanla toplam derleme süresini 15 dakikadan 8 dakikaya düşürür. Sonunda ürünler xcodebuild -exportArchive ile tek bir .xcarchive'de birleştirilir.

bash
#!/bin/bash — xcodebuild ile CI/CD derlemesi
# 1. Temizleme ve derleme
xcodebuild clean archive \
  -workspace "MyApp.xcworkspace" \
  -scheme "MyApp Production" \
  -configuration Release \
  -sdk iphoneos \
  -archivePath "build/MyApp.xcarchive" \
  CODE_SIGN_STYLE="Manual" \
  PROVISIONING_PROFILE_SPECIFIER="match AppStore"

# 2. IPA'ya dışa aktarma
xcodebuild -exportArchive \
  -archivePath "build/MyApp.xcarchive" \
  -exportPath "build/ipa" \
  -exportOptionsPlist "ExportOptions.plist"

Sık sorulan sorular

Tipik bir proje için kaç şema gerekir?

Genellikle 2-3 şema yeterlidir: Development (Debug), Staging (test sunucusu için bağımsız değişkenlerle) ve Production (Release). Modüler kütüphaneler için — test ayarlarıyla tek bir şema. Çok fazla şema oluşturmayın: her yeni şema bakım gerektirir.

Scheme, Build Configuration'dan nasıl farklıdır?

Build Configuration (Debug/Release), .xcconfig içinde tanımlanan derleyici bayrakları kümesidir. Scheme, her biri bir Build Configuration'a referans veren eylemler kümesidir. Şema "başlatmada Debug kullan" der, yapılandırma "Debug, optimizasyon olmadan, sembollerle" demektir.

Scheme'den koda bağımsız değişkenler nasıl iletilir?

Bağımsız değişkenler ProcessInfo.processInfo.arguments ve UserDefaults'a girer (bağımsız değişken kısa çizgiyle başlıyorsa). Ortam değişkenleri ProcessInfo.processInfo.environment'a girer. Kodda: -FeatureFlag YES biçimindeki bağımsız değişkenler için UserDefaults.standard.bool(forKey: "FeatureFlag").

Birden çok hedef için tek bir şema olabilir mi?

Evet, Build Action'a birden çok hedef eklenebilir. Örneğin, "App + Watch + Widget" şeması üç hedefi de sıralı (parallelizeBuildables=NO ise) veya paralel (YES ise) derler. Uygulamayı arşivlemek için ana hedef yeterlidir; diğerleri bağımlılık olarak derlenir.

SPM kullanılıyorsa neden şema gerekir?

Swift Package Manager şemaların yerini almaz: şema, SPM bağımlılıklarının hangi yapılandırmayla derleneceğini, hangi testlerin çalıştırılacağını ve nasıl arşivleneceğini hâlâ belirler. SPM paketlerinin kendi şemaları olabilir; paket eklendiğinde bunlar projeye otomatik olarak içe aktarılır.

Özet

  • Scheme, Xcode eylemlerinin XML yapılandırmasıdır: Build, Run, Test, Profile, Analyze, Archive.
  • Build Configuration (Debug/Release), şemanın her eylemi için ayrı ayrı ayarlanır.
  • Shared şemalar Git'te saklanır ve tüm ekip tarafından kullanılır, private yalnızca yereldir.
  • Bağımsız değişkenler ve Scheme'deki ortam değişkenleri, kodu değiştirmeden ortam değiştirmeyi sağlar.
  • CI/CD, derleme bütünlüğünü sağlamak için Scheme'yi xcodebuild -scheme ile kullanır.
  • Tanılama (ASan, TSan, UBSan), geliştirme aşamasında hataları bulmak için şemada yapılandırılır.
  • Öneri: Dev/Staging/Production için 2-3 shared şema bulundurun ve private şemaları depoda saklamayın.

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun