iOS Simulator: ce este și cum funcționează în Xcode

Autor: IT Sectr Publicat: 2026-02-09 Timp de citire: 8 min

Xcode Simulator — instrumentul încorporat Apple care rulează aplicații iOS pe Mac fără un dispozitiv fizic. Simulatorul compilează codul sub arhitectura x86_64 a gazdei, asigurând o viteză mare de testare. Documentația Apple descrie ciclul complet de depanare folosind simulatorul pentru iPhone, iPad, Apple Watch și Apple TV.

Principalele puncte

  • Xcode Simulator — emularea dispozitivului iOS la nivel de aplicație fără emularea completă a arhitecturii ARM
  • Diferența față de dispozitivul real — simulatorul nu suportă camera, GPU Metal, senzorii și notificările push (înainte de Xcode 11.4)
  • TARGET_OS_SIMULATOR — directivă pentru verificarea mediului de execuție în codul Objective-C și Swift
  • Teste unitare și UI — simulatorul suportă setul complet XCTest cu posibilitatea de rulare pe servere CI
  • Mai multe platforme — simulatorul suportă iPhone, iPad, Apple Watch, Apple TV și Vision Pro

Ce este Simulator în Xcode?

Xcode Simulator — instrument pentru rularea și depanarea aplicațiilor iOS direct pe Mac. Spre deosebire de emulatorul Android, simulatorul Apple nu emulează procesorul ARM al dispozitivului. În schimb, codul este compilat în cod mașină al arhitecturii gazdei (x86_64 pe Intel Mac sau arm64 pe Apple Silicon).

Simulatorul utilizează framework-urile iOS direct din SDK, oferind acces la UIKit, SwiftUI, Foundation și Core Data. Potrivit Apple (WWDC 2024), peste 90% dintre dezvoltatori folosesc simulatorul în etapa de dezvoltare, conectând dispozitivele fizice doar pentru testarea finală.

Fiecare versiune Xcode include un set de simulatoare pentru diferite modele de dispozitive și versiuni iOS. De exemplu, Xcode 16 conține simulatoare pentru iPhone 16 Pro cu iOS 18, iPad Pro M4 cu iPadOS 18, Apple Watch Series 10 și Apple TV 4K.

Instalarea și rularea simulatorului

Simulatorul se instalează împreună cu Xcode din Mac App Store. Pentru a adăuga versiuni suplimentare iOS, utilizați meniul Settings → Platforms. Selectați simulatorul în schema de compilare (Scheme) și apăsați Run. Alternativ, rulați simulatorul prin meniul Xcode → Open Developer Tool → Simulator.

swift
// Verificarea versiunii minime de iOS pentru simulator
if #available(iOS 18.0, *) {
    print("API iOS 18 disponibile")
}

Diferențele dintre simulator și dispozitivul real

Înțelegerea diferențelor dintre simulator și dispozitivul real este critică pentru testarea de calitate. Principalele diferențe constau în arhitectura procesorului, capacitățile hardware și performanța grafică.

CaracteristicăSimulatorDispozitiv real
Arhitectura CPUx86_64 / arm64 (Mac)ARM64 (Apple Silicon)
GPU MetalSimulare prin GPU MacApple GPU nativ
CamerăIndisponibilăCompletă
Accelerometru/GiroscopIndisponibileSenzori hardware
Touch ID / Face IDSimulare prin meniuBiometrie hardware
Notificări pushDin Xcode 11.4 (fișier .apns)Server APNs
Bluetooth LENesuportatStivă completă

Performanța în simulator este de obicei mai mare decât pe dispozitivul real, deoarece folosește procesorul puternic al Mac-ului. Acest lucru creează o impresie falsă de rapiditate. Animațiile, lucrul cu Core Data și solicitările de rețea pe dispozitivul real pot funcționa mai lent.

Când este obligatorie testarea pe dispozitiv

Rulați obligatoriu aplicația pe un dispozitiv real înainte de lansare. Scenarii critice: camera și AVFoundation, Bluetooth și CoreBluetooth, notificările push prin APNs, lucrul cu sistemul de fișiere în App Sandbox, performanța grafică în Metal și consumul de energie al bateriei.

Verificarea TARGET_OS_SIMULATOR în cod

Pentru compilarea condiționată a codului pentru simulator, Apple oferă TARGET_OS_SIMULATOR în Objective-C și targetEnvironment(simulator) în Swift. Această verificare permite adăugarea de loguri de depanare, obiecte mock sau dezactivarea codului dependent de hardware.

swift
import UIKit

class CameraViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        #if targetEnvironment(simulator)
        showMockCameraPreview()
        print("Simulator: folosim camera mock")
        #else
        setupRealCameraSession()
        #endif
    }
}

În Objective-C, directiva #if TARGET_OS_SIMULATOR funcționează similar. Folosiți-o pentru a dezactiva codul care necesită senzori hardware sau cameră. În etapa de compilare pentru simulator, acest cod nu ajunge în fișierul binar.

objective-c
#if TARGET_OS_SIMULATOR
NSLog(@"Rularea în simulator — camera indisponibilă");
self.cameraButton.hidden = YES;
#else
self.cameraButton.hidden = NO;
#endif

Scenarii tipice de utilizare a verificării

Verificarea TARGET_OS_SIMULATOR se aplică în trei cazuri: înlocuirea camerei cu un obiect mock în testele UI, dezactivarea Core Bluetooth pentru accelerarea dezvoltării și înregistrarea informațiilor de depanare care nu trebuie să ajungă în versiunea de lansare. Evitați utilizarea verificării pentru a modifica logica de business — aceasta poate duce la bug-uri pe dispozitivul real.

Rularea testelor în simulator

Xcode Simulator suportă setul complet de teste XCTest: teste unitare (XCTestCase), teste UI (XCUITestCase) și teste de performanță. Pentru testarea pe simulator nu este necesar un certificat de dezvoltator semnat, ceea ce simplifică configurarea CI/CD.

swift
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)
    }
}

Pentru rularea testelor din linia de comandă, utilizați xcodebuild test specificând schema și simulatorul. Parametrul -destination determină simulatorul concret pe care vor fi rulate testele.

bash
# Rularea testelor unitare pe simulatorul iPhone 16, iOS 18
xcodebuild test \
  -scheme "MyApp" \
  -destination "platform=iOS Simulator,name=iPhone 16,OS=18.0" \
  -testPlan "AllTests"

Limitări și capcane

În ciuda confortului, Xcode Simulator are o serie de limitări care pot duce la bug-uri pe dispozitivul real. Cea mai critică este lipsa emulării ARM: codul este compilat sub arhitectura gazdei, iar comportamentul unor operații poate diferi.

Core Data și sistemul de fișiere funcționează mai rapid pe simulator din cauza SSD-ului Mac-ului. Pe dispozitivul real cu memorie NAND, viteza de citire/scriere este mai mică. Testați performanța Core Data pe dispozitiv înainte de lansare, în special pentru seturi mari de date.

Verificarea consumului de energie pe simulator este imposibilă — simulatorul se alimentează de la Mac. Modurile de fundal, inclusiv încărcarea conținutului și operațiile fetch, se comportă diferit pe dispozitivul real din cauza limitărilor bateriei și Background Task Scheduler.

Senzori hardware și biometrie

Simulatorul nu are acces la senzorii hardware ai iPhone-ului. Face ID și Touch ID pot fi simulate prin meniul simulatorului: Features → Face ID → Matching Face. Accelerometrul, giroscopul și barometrul sunt indisponibile — codul care se bazează pe CMDeviceMotion trebuie testat pe dispozitiv. Pentru Core Location, puteți seta coordonate prin Debug → Simulate Location cu selectarea unui fișier GPX.

Verificarea iCloud și StoreKit pe simulator este, de asemenea, limitată. StoreKit Test permite simularea achizițiilor fără App Store Connect real, dar verificarea mediului Sandbox și a achizițiilor de producție necesită un dispozitiv fizic. Sincronizarea iCloud Drive și CloudKit în simulator funcționează incorect — Apple recomandă testarea acestor scenarii doar pe dispozitive reale.

Simulator pe Mac Apple Silicon

Pe Mac-ul cu procesoare din seria M, simulatorul funcționează fundamental diferit: codul este compilat în ARM64 nativ, ca pe un iPhone real, nu în x86_64. Acest lucru reduce semnificativ decalajul dintre simulator și dispozitiv. Aplicațiile rulate pe simulatorul Apple Silicon folosesc aceleași instrucțiuni ARM ca pe iPhone-ul fizic, ceea ce face testele de performanță mai reprezentative. Diferența de performanță Metal și Core Animation între simulatorul seriei M și iPhone-ul real este minimă în comparație cu simulatorul Intel.

Configurarea simulatorului pentru CI

Configurarea simulatorului pentru CI necesită crearea prealabilă a dispozitivului și versiunii iOS dorite. Pe serverele Continuous Integration, simulatoarele nu se creează automat — trebuie adăugate prin xcrun simctl create înainte de rularea testelor.

bash
# Crearea simulatorului pentru CI
xcrun simctl create \
  "iPhone 16 CI" \
  "com.apple.CoreSimulator.SimDeviceType.iPhone-16" \
  "com.apple.CoreSimulator.SimRuntime.iOS-18-0"

# Rularea testelor pe simulatorul creat
xcodebuild test \
  -workspace MyApp.xcworkspace \
  -scheme MyApp \
  -destination "id=$(xcrun simctl list devices | grep 'iPhone 16 CI' | awk -F'[][]' '{print }')"

Pentru testarea paralelă pe CI, configurați mai multe simulatoare cu versiuni diferite de iOS. Xcode Cloud, GitHub Actions și Bitrise suportă rularea paralelă a testelor, reducând timpul de execuție de 2-3 ori. Asigurați-vă că pe serverul CI sunt instalate toate simulatoarele iOS necesare pentru testare.

Întrebări frecvente

Cu ce se deosebește simulatorul Xcode de dispozitivul real?

Simulatorul funcționează pe arhitectura x86_64 și folosește CPU-ul Mac-ului, în timp ce dispozitivul real funcționează pe ARM64 Apple Silicon. Simulatorul nu emulează camera, senzorii, GPU Metal, Bluetooth LE și bateria. Codul este compilat sub arhitectura gazdei, de aceea testele de performanță pe simulator nu sunt reprezentative.

Cum verific în cod dacă aplicația rulează în simulator?

Folosiți #if targetEnvironment(simulator) în Swift sau #if TARGET_OS_SIMULATOR în Objective-C. Acestea sunt directive de compilare condiționată: codul din bloc se execută doar în simulator. Util pentru obiecte mock pentru cameră și loguri de depanare indisponibile pe dispozitivul real.

Se pot testa notificările push în simulator?

Da, începând cu Xcode 11.4, simulatorul suportă simularea notificărilor push printr-un fișier .apns cu structură JSON. Trageți fișierul pe simulatorul pornit sau utilizați comanda xcrun simctl push. Notificările se afișează complet ca pe un dispozitiv real.

Care sunt limitările Xcode Simulator?

Simulatorul nu suportă camera, microfonul, accelerometrul, giroscopul, TrueDepth, Touch ID (în afară de simulare), Face ID (în afară de simulare), Bluetooth LE și NFC. Performanța Metal este simulată pe GPU-ul Mac-ului, ceea ce nu reflectă performanța reală a iPhone-ului. Consumul de energie nu poate fi măsurat.

Cum rulez teste pe CI folosind simulatorul?

Creați un simulator prin xcrun simctl create, apoi rulați xcodebuild test cu parametrul -destination care specifică platform=iOS Simulator și numele dispozitivului. Pentru testare paralelă, creați mai multe simulatoare cu versiuni diferite de iOS în configurația CI.

Concluzii

  • Xcode Simulator — instrument pentru rularea aplicațiilor iOS pe Mac, care compilează codul sub arhitectura gazdei fără emulare ARM
  • Diferențe față de dispozitiv — simulatorul nu suportă camera, GPU Metal, senzorii, Bluetooth, NFC și nu oferă performanță reprezentativă
  • Compilare condiționată — TARGET_OS_SIMULATOR și targetEnvironment(simulator) permit adăugarea de obiecte mock și loguri de depanare
  • Testare — XCTest suportă teste unitare, UI și de performanță pe simulator fără certificat de dezvoltator
  • Configurare CI — creați simulatoare prin xcrun simctl și rulați teste paralele pe mai multe versiuni iOS
  • Scenarii critice — camera, Bluetooth, notificările push și performanța Metal necesită testare pe dispozitiv real
  • Apple Silicon Mac — simulatorul pe seria M rulează aplicații iOS cu diferențe arhitecturale minime

Vom dezvolta o aplicație mobilă la cheie

IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.

Discutați proiectul

Citiți și