Xcode-da Scheme — iOS, macOS, watchOS yoki tvOS uchun ilovani qanday yig'ish, test qilish, profillash va arxivlashni belgilaydigan konfiguratsiya. Har bir Scheme o'z parametrlari, argumentlari va muhit o'zgaruvchilari bilan amallar to'plamini (Build, Run, Test, Profile, Analyze, Archive) o'z ichiga oladi. Apple Developer Documentation, 2025 ma'lumotlariga ko'ra, Scheme Xcode-da yig'ish konfiguratsiyalarini boshqarishning asosiy vositasi bo'lib, parametrlarni qo'lda almashtirish o'rnini egallaydi. Xcode loyiha birinchi marta ochilganda har bir target uchun avtomatik ravishda sxema yaratadi.
Asosiy narsalar
Scheme Xcode-da ilovani yig'ish va tahlil qilish uchun amallar ketma-ketligi va ularning parametrlarini tavsiflovchi XML-fayl (.xcscheme kengaytmasi). Har bir Scheme bir yoki bir nechta targetga bog'langan va har bir amal qaysi konfiguratsiya bilan (Debug, Release, AdHoc) bajarilishini belgilaydi. Scheme Android'dagi Build Variantning analogi, lekin yanada moslashuvchan tuzilishga ega: bitta sxema turli amallar uchun turli targetlarni o'z ichiga olishi mumkin.
Xcode loyiha birinchi marta ochilganda har bir target uchun avtomatik sxema yaratadi. Sxemaning standart nomi target nomi bilan mos keladi. Agar loyihada test targeti bo'lsa, Xcode uni avtomatik ravishda asosiy target sxemasining Test amaliga qo'shadi. Bir nechta targetli loyihalar uchun (asosiy ilova + watchOS + extension) Xcode har biri uchun alohida sxema yaratadi, lekin barcha targetlarni birdaniga yig'adigan bitta sxema ham yaratish mumkin.
Sxemalar xcshareddata/xcschemes/ katalogida (shared uchun) yoki xcuserdata/<user>/xcschemes/ katalogida (private uchun) saqlanadi. Shared sxemalar Git'ga tushadi va butun jamoa tomonidan ishlatiladi. Private sxemalar mahalliy saqlanadi va sinxronlashmaydi. .xcscheme fayli ildiz elementi <Scheme> bo'lgan XML formatiga ega. Ichida har bir amal uchun bloklar bor: BuildAction, TestAction, LaunchAction, ProfileAction, AnalyzeAction, ArchiveAction.
.xcscheme qo'lda yoki Xcode orqali tahrirlanishi mumkin bo'lgan XML-fayl. Asosiy elementlar: <BuildAction> (yig'iladigan targetlar ro'yxati), <TestAction> (test targetlariga havolalar), <LaunchAction> (ishga tushirish konfiguratsiyasi), <ProfileAction>, <AnalyzeAction>, <ArchiveAction>. Har bir blok ushbu amal uchun qaysi konfiguratsiya (Debug/Release) ishlatilishini belgilaydigan buildConfiguration atributini o'z ichiga oladi.
Scheme oltita amaldan iborat bo'lib, ularning har birini mustaqil sozlash mumkin. Build Action qaysi targetlar va qanday tartibda yig'ilishini belgilaydi. Run Action — ilova qanday ishga tushishini: qaysi argumentlar, muhit o'zgaruvchilari va qaysi konfiguratsiya bilan. Test Action — qaysi testlar bajarilishini va qaysi code coverage variantlari yoqilganini. Profile Action — profillash uchun Instruments asboblari bilan ishga tushirish. Analyze Action — Clang Static Analyzer bilan kodning statik tahlili. Archive Action — App Store'da nashr qilish yoki AdHoc tarqatish uchun yig'ish.
Har bir amal uchun alohida build configuration o'rnatish mumkin. Odatda Run va Test uchun Debug, Archive uchun esa Release ishlatiladi. Build configuration kompilyator bayroqlari, optimizatsiyalar va tuzatish ma'lumotlari to'plamini belgilaydi. Xcode ikkita standart konfiguratsiyani taqdim etadi: Debug (optimizatsiyasiz, tuzatish belgilari bilan) va Release (optimizatsiyalar bilan, tuzatish ma'lumotlarisiz). Dasturchi project.xcconfig orqali maxsus konfiguratsiyalar qo'shishi mumkin.
Archive amali ayniqsa muhim — u keyinchalik App Store yoki AdHoc uchun .ipa fayliga eksport qilinadigan .xcarchive yaratadi. Archive Action standart ravishda Release konfiguratsiyasidan foydalanadi, lekin AdHoc yoki Distribution'ga o'tkazish mumkin. Archive Action'da revealArchiveInOrganizer bayrog'i ham mavjud — arxivlash tugagandan so'ng Xcode arxiv bilan keyingi amallar uchun Organiser'ni ochadi.
<!-- iOS ilovasi uchun .xcscheme misoli -->
<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>
Yangi sxema yaratish Xcode menyusi orqali amalga oshiriladi: Product → Scheme → New Scheme yoki Scheme panelidagi (Run tugmasi yonida) “+” tugmasi bilan. Yaratishda sxema uchun target tanlanadi. Agar sxema “duplicate” sifatida tanlangan bo'lsa, Xcode mavjud sxemadan sozlamalarni avtomatik nusxalaydi. Yangi sxemalar standart ravishda private sifatida saqlanadi — jamoaga nashr qilish uchun Manage Schemes'da Shared'ni yoqish kerak.
Edit Scheme oynasi (Product → Scheme → Edit Scheme) amallar soniga ko'ra oltita yorliqdan iborat. Har bir yorliqda build configuration, ishga tushirish argumentlari, muhit o'zgaruvchilari va diagnostik bayroqlarni o'zgartirish mumkin. Run yorlig'ida quyidagi variantlar mavjud: executable (qaysi binar fayl ishga tushirilishi), wait for executable to be launched (ishga tushirilayotgan jarayonlarni tuzatish uchun), debugger (LLDB yoki None), launch arguments, environment variables va kengaytirilgan variantlar (Address Sanitizer, Thread Sanitizer, Main Thread Checker, Memory Management).
Diagnostika uchun Address Sanitizer (ASan) — massiv chegarasidan chiqishni, use-after-free va C/C++/ObjC kodidagi boshqa xotira xatolarini aniqlaydi. Thread Sanitizer (TSan) — ko'p oqimli kodda data race holatlarini aniqlaydi. Undefined Behavior Sanitizer (UBSan) — masalan, ishorali int'ning to'lib ketishi kabi aniqlanmagan xatti-harakatni ochib beradi. Bu variantlar Edit Scheme → Run → Diagnostics'da mavjud va faqat Debug yig'ilishlari uchun ishlaydi. Barcha sanitayzerlarni yoqish ishga tushirishni 2-3 marta sekinlashtirishi mumkin, shuning uchun ularni tanlab yoqish tavsiya etiladi.
Oddiy amaliyot — har bir muhit uchun alohida sxemalar yaratish: Dev, Staging, Production. Har bir sxema bir xil Build Configuration'dan foydalanadi (Dev uchun Debug, Production uchun Release), lekin turli ishga tushirish argumentlari bilan: Dev uchun -FIRAnalyticsDebugEnabled, -com.apple.CoreData.SQLDebug 1 va Production uchun ularning yo'qligi. Ishga tushirish argumentlari UserDefaults'ga (ProcessInfo.processInfo.arguments) uzatiladi va ilova ishga tushganda o'qish uchun mavjud bo'ladi. Bu kodni o'zgartirmasdan server URL'ini, jurnal darajasini va funksiyalarni almashtirish imkonini beradi.
Shared sxemalar <project>.xcworkspace/xcshareddata/xcschemes/ yoki <project>.xcodeproj/xcshareddata/xcschemes/ papkasida saqlanadi va Git repozitoriyasiga tushadi. Jamoaning barcha dasturchilari bu sxemalarni Xcode'da ko'radi. Shared sxemalar — sxemalarni jamoa bo'ylab tarqatishning yagona usuli. Agar dasturchi muhim sxema yaratgan bo'lsa (masalan, “Staging Archive”), lekin uni Shared deb belgilamagan bo'lsa, qolgan jamoa uni ko'rmaydi va bu chalkashlikka olib keladi: har kim o'z sozlamalari bilan o'z sxemasini yaratadi.
Private sxemalar xcuserdata/<user>/xcschemes/ papkasida saqlanadi va Git'ga tushmaydi. Ular shaxsiy konfiguratsiyalar uchun foydali: masalan, ma'lum bir dasturchi uchun barcha sanitayzerlar yoqilgan sxema. Private sxemalar loyiha yig'ilishi bog'liq bo'lgan tanqidiy sozlamalarni o'z ichiga olmasligi kerak — agar dasturchi loyihani tark etsa, uning private sxemalari yo'qoladi. Tavsiya: CI/CD'da va kamida ikki dasturchi tomonidan ishlatiladigan barcha sxemalarni Shared qilish.
Sxemalarni boshqarish Manage Schemes (Product → Scheme → Manage Schemes) orqali amalga oshiriladi. Oynada loyihaning barcha sxemalari, ularning holati (Shared/Private) va qo'shish/o'chirish uchun +/— tugmalari ko'rsatiladi. Shared katakchasi sxemaning jamoa uchun ko'rinishini o'zgartiradi. Git ziddiyatida (ikki dasturchining .xcscheme'dagi o'zgarishlari) birlashishni ehtiyotkorlik bilan hal qilish kerak — XML-fayllar turli target identifikatorlarini o'z ichiga olishi mumkin. .xcscheme'ni merge vaqtida bloklanadigan fayllarga qo'shish tavsiya etiladi (git lfs yoki .gitattributes).
Arguments Scheme'da ishga tushirishda ilovaga uzatiladigan qatorlar (ProcessInfo.processInfo.arguments) va muhit o'zgaruvchilari (ProcessInfo.processInfo.environment). Argumentlar bayroqlar uchun ishlatiladi: -AppleLanguages (ru), -AppleLocale ru_RU rus lokalini simulyatsiya qilish uchun yoki -FIRDebugEnabled Firebase tuzatishni yoqish uchun. Muhit o'zgaruvchilari konfiguratsiya uchun qo'llaniladi: API_BASE_URL=http://localhost:3000, LOG_LEVEL=debug.
Turli muhitlarda funksiyalarni boshqarish (feature flags) uchun Arguments + Build Configuration kombinatsiyasi ishlatiladi. Dev sxemasida -FeatureFlagNewOnboarding YES argumenti o'rnatiladi, Production'da esa — -FeatureFlagNewOnboarding NO (yoki argument yo'q). Kodda tekshirish: UserDefaults.standard.bool(forKey: "FeatureFlagNewOnboarding"). Bu yondashuv production qiymatlarini kodni o'zgartirmasdan va commit qilmasdan staging'da funksiyalarni bosqichma-bosqich yoqish imkonini beradi.
Muhim: Scheme argumentlari va muhit o'zgaruvchilari Info.plist'dagi qiymatlarni qayta yozadi. Info.plist'da API_URL ko'rsatilgan bo'lsa, Scheme'da esa Run Action uchun API_URL=http://localhost — Xcode'dan ishga tushirilganda Scheme'dagi qiymat ishlatiladi. Qurilmadan ishga tushirilganda (Xcode'dan emas) — Info.plist'dagi qiymat. Bu mahalliy ishlab chiqish uchun qulay, lekin esda tutish kerak: Scheme o'zgaruvchilari yig'ilishga tushmaydi — ular faqat Xcode orqali ishga tushirilganda ta'sir qiladi.
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")
}
}
// Ishga tushirishda ishlatiladi
let env = AppEnvironment()
NetworkConfig.shared.configure(baseURL: env.apiBaseURL)
CI/CD'da (GitHub Actions, Jenkins, GitLab CI) Scheme xcodebuild buyrug'ining asosiy argumenti sifatida ishlatiladi. Misol: xcodebuild -workspace MyApp.xcworkspace -scheme MyApp -configuration Release -sdk iphoneos archive. -scheme bayrog'i qaysi sxemani ishlatishni ko'rsatadi. xcodebuild barcha sozlamalarni .xcscheme faylidan o'qiydi, jumladan build configuration, targetlar va yig'ish tartibi. Bu CI/CD ilovani mahalliy IDE bilan bir xil parametrlarda yig'ishini kafolatlaydi.
CI/CD uchun Shared sxemalar tanqidiy ahamiyatga ega. Agar sxema Shared bo'lmasa, xcodebuild uni repozitoriyada topa olmaydi va yig'ish “Scheme not found” xatosi bilan qulab tushadi. Qoida: CI/CD'ni sozlashdan oldin ishlatiladigan barcha sxemalar Shared deb belgilanganiga ishonch hosil qiling. Ikkinchi qoida: CI/CD'da standart sxemani ishlatmang (Xcode avtomatik ravishda birinchi sxemani tanlaydi) — har doim sxema nomini -scheme bayrog'i orqali aniq uzating.
Bir nechta sxemani parallel yig'ish uchun (masalan, ilova va watchOS kengaytmasi) xcodebuild'ni ketma-ket yoki parallel ishga tushirish mumkin. Zamonaviy CI tizimlari matritsa orqali turli sxemalarni yig'ishni parallellashtirish imkonini beradi: bitta job iOS ilovasini yig'adi, ikkinchisi — watchOS kengaytmasini. Bu ikkita parallel agent bilan umumiy yig'ish vaqtini 15 daqiqadan 8 daqiqagacha qisqartiradi. Oxirida artefaktlar xcodebuild -exportArchive yordamida yagona .xcarchive faylida birlashtiriladi.
#!/bin/bash — xcodebuild bilan CI/CD qurish
# 1. Tozalash va yig'ish
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'ga eksport
xcodebuild -exportArchive \
-archivePath "build/MyApp.xcarchive" \
-exportPath "build/ipa" \
-exportOptionsPlist "ExportOptions.plist"
Tez-tez so'raladigan savollar
Odatda 2-3 sxema yetarli: Development (Debug), Staging (test serveri uchun argumentlar bilan) va Production (Release). Modulli kutubxonalar uchun — test uchun sozlamalari bilan bitta sxema. Sxemalarni ko'paytirmang — har bir yangi sxema qo'llab-quvvatlashni talab qiladi.
Build Configuration (Debug/Release) — .xcconfig'da aniqlangan kompilyator bayroqlari to'plami. Scheme — har biri Build Configuration'ga havola qiladigan amallar to'plami. Sxema “ishga tushirishda Debug'dan foydalaning” deydi, konfiguratsiya esa “Debug — bu optimizatsiyasiz, belgilar bilan” deb belgilaydi.
Argumentlar ProcessInfo.processInfo.arguments va UserDefaults'ga tushadi (agar argument chiziqcha bilan boshlansa). Muhit o'zgaruvchilari — ProcessInfo.processInfo.environment'ga. Kodda: -FeatureFlag YES ko'rinishidagi argumentlar uchun UserDefaults.standard.bool(forKey: "FeatureFlag").
Ha, Build Action'da bir nechta target qo'shish mumkin. Masalan, “App + Watch + Widget” sxemasi har uchala targetni ketma-ket (parallelizeBuildables=NO bo'lsa) yoki parallel (YES) yig'adi. Ilovani arxivlash uchun asosiy target yetarli — qolganlari bog'liqliklar sifatida yig'iladi.
Swift Package Manager sxemalarni o'rnini bosmaydi — sxema hali ham SPM bog'liqliklari qaysi konfiguratsiya bilan yig'ilishini, qaysi testlar bajarilishini va qanday arxivlanishini belgilaydi. SPM paketlari paket qo'shilganda loyihaga avtomatik import qilinadigan o'z sxemalariga ega bo'lishi mumkin.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.