Xcode Simulator — fiziki cihaz olmadan Mac-da iOS tətbiqlərini işə salan Apple-ın daxili aləti. Simulyator kodu x86_64 host arxitekturası altında kompilyasiya edir, bu da yüksək test sürətini təmin edir. Apple Sənədləri iPhone, iPad, Apple Watch və Apple TV üçün simulyatordan istifadə edərək tam debug dövrünü təsvir edir.
Əsas məqamlar
Xcode Simulator — iOS tətbiqlərini birbaşa Mac-da işə salmaq və debug etmək üçün alət. Android emulyatorundan fərqli olaraq, Apple simulyatoru cihazın ARM prosessorunu emulyasiya etmir. Bunun əvəzinə kod host arxitekturasının maşın koduna kompilyasiya olunur (Intel Mac-da x86_64 və ya Apple Silicon-da arm64).
Simulyator iOS framework-lərini birbaşa SDK-dan istifadə edir, UIKit, SwiftUI, Foundation və Core Data-ya girişi təmin edir. Apple-ın məlumatına görə (WWDC 2024), tərtibatçıların 90%-dən çoxu inkişaf mərhələsində simulyatordan istifadə edir, fiziki cihazları yalnız son test üçün qoşur.
Hər Xcode versiyası müxtəlif cihaz modelləri və iOS versiyaları üçün simulyatorlar dəsti daxildir. Məsələn, Xcode 16 iOS 18 ilə iPhone 16 Pro, iPadOS 18 ilə iPad Pro M4, Apple Watch Series 10 və Apple TV 4K simulyatorlarını ehtiva edir.
Simulyator Xcode ilə birlikdə Mac App Store-dan quraşdırılır. Əlavə iOS versiyaları əlavə etmək üçün Settings → Platforms menyusundan istifadə edin. Quraşdırma sxemində (Scheme) simulyatoru seçin və Run düyməsini basın. Alternativ olaraq simulyatoru Xcode → Open Developer Tool → Simulator menyusu vasitəsilə işə salın.
// Simulyator üçün minimum iOS versiyasının yoxlanılması
if #available(iOS 18.0, *) {
print("iOS 18 API mövcuddur")
}Simulyator və real cihaz arasındakı fərqləri başa düşmək keyfiyyətli test üçün kritik əhəmiyyət daşıyır. Əsas fərqlər prosessor arxitekturası, aparat imkanları və qrafik performansındadır.
| Xüsusiyyət | Simulyator | Real cihaz |
|---|---|---|
| CPU arxitekturası | x86_64 / arm64 (Mac) | ARM64 (Apple Silicon) |
| GPU Metal | Mac GPU vasitəsilə simulyasiya | Yerli Apple GPU |
| Kamera | Mövcud deyil | Tam funksiyalı |
| Akselerometr/Giroskop | Mövcud deyil | Aparat sensorları |
| Touch ID / Face ID | Menyu vasitəsilə simulyasiya | Aparat biometriyası |
| Push bildirişləri | Xcode 11.4-dən (.apns faylı) | APNs server |
| Bluetooth LE | Dəstəklənmir | Tam stack |
Performans simulyatorda adətən real cihazdan yüksəkdir, çünki Mac-ın güclü prosessoru istifadə olunur. Bu, sürət haqqında yanlış təəssürat yaradır. Animasiyalar, Core Data ilə iş və şəbəkə sorğuları real cihazda daha yavaş işləyə bilər.
Buraxılışdan əvvəl tətbiqi mütləq real cihazda işə salın. Kritik ssenarilər: kamera və AVFoundation, Bluetooth və CoreBluetooth, APNs vasitəsilə push bildirişləri, App Sandbox-da fayl sistemi ilə iş, Metal-da qrafik performansı və batareya enerji sərfiyyatı.
Simulyator üçün kodun şərti kompilyasiyası üçün Apple Objective-C-də TARGET_OS_SIMULATOR və Swift-də targetEnvironment(simulator) təqdim edir. Bu yoxlama debug loqları, mok-obyektlər əlavə etməyə və ya aparatdan asılı kodu söndürməyə imkan verir.
import UIKit
class CameraViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
#if targetEnvironment(simulator)
showMockCameraPreview()
print("Simulyator: mok-kameradan istifadə edirik")
#else
setupRealCameraSession()
#endif
}
}Objective-C-də #if TARGET_OS_SIMULATOR direktivi eyni şəkildə işləyir. Onu aparat sensorları və ya kamera tələb edən kodu söndürmək üçün istifadə edin. Simulyator üçün kompilyasiya mərhələsində bu kod binar fayla daxil olmur.
#if TARGET_OS_SIMULATOR
NSLog(@"Simulyatorda işə salma — kamera mövcud deyil");
self.cameraButton.hidden = YES;
#else
self.cameraButton.hidden = NO;
#endifTARGET_OS_SIMULATOR yoxlaması üç halda tətbiq olunur: UI testləri zamanı kameranın mok-obyektlə əvəz edilməsi, inkişafı sürətləndirmək üçün Core Bluetooth-un söndürülməsi və buraxılış versiyasına daxil olmamalı olan debug məlumatlarının loglanması. Biznes məntiqini dəyişmək üçün yoxlamadan istifadə etməkdən çəkinin — bu, real cihazda xətalara səbəb ola bilər.
Xcode Simulator XCTest testlərinin tam dəstini dəstəkləyir: Unit-testlər (XCTestCase), UI-testlər (XCUITestCase) və performans testləri. Simulyatorda test etmək üçün imzalanmış tərtibatçı sertifikatı tələb olunmur, bu da CI/CD konfiqurasiyasını sadələşdirir.
import XCTest
final class LoginTests: XCTestCase {
var app: XCUIApplication!
override func setUp() {
continueAfterFailure = false
app = XCUIApplication()
app.launch()
}
func testLoginButtonExists() {
XCTAssertTrue(app.buttons["loginButton"].exists)
}
func testEmptyEmailValidation() {
app.textFields["emailField"].tap()
app.buttons["loginButton"].tap()
let errorLabel = app.staticTexts["errorMessage"]
XCTAssertTrue(errorLabel.exists)
}
}Testləri komanda sətrindən işə salmaq üçün sxem və simulyatoru göstərməklə xcodebuild test istifadə edin. -destination parametri testlərin işə salınacağı konkret simulyatoru müəyyən edir.
# iPhone 16, iOS 18 simulyatorunda Unit-testlərin işə salınması
xcodebuild test \
-scheme "MyApp" \
-destination "platform=iOS Simulator,name=iPhone 16,OS=18.0" \
-testPlan "AllTests"Rahatlığa baxmayaraq, Xcode Simulator real cihazda xətalara səbəb ola biləcək bir sıra məhdudiyyətlərə malikdir. Ən kritik — ARM emulyasiyasının olmaması: kod host arxitekturası altında kompilyasiya olunur və bəzi əməliyyatların davranışı fərqlənə bilər.
Core Data və fayl sistemi Mac SSD səbəbindən simulyatorda daha sürətli işləyir. NAND yaddaşlı real cihazda oxu/yazma sürəti aşağıdır. Core Data performansını buraxılışdan əvvəl cihazda test edin, xüsusilə böyük məlumat dəstləri üçün.
Enerji sərfiyyatının simulyatorda yoxlanılması mümkün deyil — simulyator Mac-dan qidalanır. Fon rejimləri, o cümlədən məzmun yükləmə və fetch əməliyyatları, batareya və Background Task Scheduler məhdudiyyətləri səbəbindən real cihazda fərqli davranır.
Simulyator iPhone-un aparat sensorlarına girişə malik deyil. Face ID və Touch ID simulyator menyusu vasitəsilə simulyasiya edilə bilər: Features → Face ID → Matching Face. Akselerometr, giroskop və barometr mövcud deyil — CMDeviceMotion-a əsaslanan kod cihazda test edilməlidir. Core Location üçün Debug → Simulate Location vasitəsilə GPX faylı seçərək koordinatlar təyin edilə bilər.
iCloud və StoreKit yoxlanılması simulyatorda da məhduddur. StoreKit Test real App Store Connect olmadan alış-verişi simulyasiya etməyə imkan verir, lakin Sandbox mühiti və istehsal alışlarının yoxlanılması fiziki cihaz tələb edir. Simulyatorda iCloud Drive və CloudKit sinxronizasiyası düzgün işləmir — Apple bu ssenariləri yalnız real cihazlarda test etməyi tövsiyə edir.
M seriyalı prosessorlu Mac-da simulyator prinsipial olaraq fərqli işləyir: kod yerli ARM64-ə kompilyasiya olunur, real iPhone-da olduğu kimi, x86_64-ə deyil. Bu, simulyator və cihaz arasındakı fərqi əhəmiyyətli dərəcədə azaldır. Apple Silicon simulyatorunda işə salınan tətbiqlər fiziki iPhone-da olduğu kimi eyni ARM təlimatlarından istifadə edir ki, bu da performans testlərini daha reprezentativ edir. M seriyalı simulyator və real iPhone arasında Metal və Core Animation performans fərqi Intel simulyatoru ilə müqayisədə minimaldır.
CI üçün simulyatorun konfiqurasiyası lazımi cihazın və iOS versiyasının əvvəlcədən yaradılmasını tələb edir. Continuous Integration serverlərində simulyatorlar avtomatik yaradılmır — onları testləri işə salmazdan əvvəl xcrun simctl create vasitəsilə əlavə etmək lazımdır.
# CI üçün simulyatorun yaradılması
xcrun simctl create \
"iPhone 16 CI" \
"com.apple.CoreSimulator.SimDeviceType.iPhone-16" \
"com.apple.CoreSimulator.SimRuntime.iOS-18-0"
# Yaradılmış simulyatorda testlərin işə salınması
xcodebuild test \
-workspace MyApp.xcworkspace \
-scheme MyApp \
-destination "id=$(xcrun simctl list devices | grep 'iPhone 16 CI' | awk -F'[][]' '{print }')"CI-da paralel test üçün müxtəlif iOS versiyaları olan bir neçə simulyator konfiqurasiya edin. Xcode Cloud, GitHub Actions və Bitrise paralel test işə salmanı dəstəkləyir ki, bu da icra müddətini 2-3 dəfə azaldır. CI serverində test üçün bütün lazımi iOS simulyatorlarının quraşdırıldığından əmin olun.
Tez-tez verilən suallar
Simulyator x86_64 arxitekturasında işləyir və Mac CPU-sudan istifadə edir, real cihaz isə ARM64 Apple Silicon-da işləyir. Simulyator kameranı, sensorları, GPU Metal, Bluetooth LE və batareyanı emulyasiya etmir. Kod host arxitekturası altında kompilyasiya olunur, buna görə simulyatordakı performans testləri reprezentativ deyil.
Swift-də #if targetEnvironment(simulator) və ya Objective-C-də #if TARGET_OS_SIMULATOR istifadə edin. Bunlar şərti kompilyasiya direktivləridir: blokdakı kod yalnız simulyatorda icra olunur. Kamera mok-obyektləri və real cihazda mövcud olmayan debug loqları üçün əlverişlidir.
Bəli, Xcode 11.4-dən etibarən simulyator JSON strukturlu .apns faylı vasitəsilə push bildirişlərinin simulyasiyasını dəstəkləyir. Faylı işləyən simulyatorun üzərinə sürükləyin və ya xcrun simctl push əmrindən istifadə edin. Bildirişlər real cihazda olduğu kimi tam göstərilir.
Simulyator kameranı, mikrofonu, akselerometri, giroskopu, TrueDepth, Touch ID (simulyasiyadan başqa), Face ID (simulyasiyadan başqa), Bluetooth LE və NFC-ni dəstəkləmir. Metal performansı Mac GPU-da simulyasiya olunur ki, bu da real iPhone performansını əks etdirmir. Enerji sərfiyyatını ölçmək mümkün deyil.
xcrun simctl create vasitəsilə simulyator yaradın, sonra platform=iOS Simulator və cihaz adını göstərən -destination parametri ilə xcodebuild test işə salın. Paralel test üçün CI konfiqurasiyasında müxtəlif iOS versiyaları olan bir neçə simulyator yaradın.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun