Xcode Simulator — vestavěný nástroj Apple, který spouští iOS aplikace na Macu bez fyzického zařízení. Simulátor kompiluje kód pod architekturou x86_64 hostitele, což zajišťuje vysokou rychlost testování. Dokumentace Apple popisuje celý cyklus ladění s použitím simulátoru pro iPhone, iPad, Apple Watch a Apple TV.
Hlavní body
Xcode Simulator — nástroj pro spouštění a ladění iOS aplikací přímo na Macu. Na rozdíl od emulátoru Android, Apple simulátor neemuluje ARM procesor zařízení. Místo toho je kód kompilován do strojového kódu architektury hostitele (x86_64 na Intel Mac nebo arm64 na Apple Silicon).
Simulátor používá iOS frameworky přímo z SDK a poskytuje přístup k UIKit, SwiftUI, Foundation a Core Data. Podle Apple (WWDC 2024) více než 90% vývojářů používá simulátor ve fázi vývoje a fyzická zařízení připojuje pouze pro konečné testování.
Každá verze Xcode obsahuje sadu simulátorů pro různé modely zařízení a verze iOS. Například Xcode 16 obsahuje simulátory iPhone 16 Pro s iOS 18, iPad Pro M4 s iPadOS 18, Apple Watch Series 10 a Apple TV 4K.
Simulátor se instaluje spolu s Xcode z Mac App Store. Pro přidání dalších verzí iOS použijte menu Settings → Platforms. Vyberte simulátor v schématu sestavení (Scheme) a stiskněte Run. Alternativně spusťte simulátor přes menu Xcode → Open Developer Tool → Simulator.
// Kontrola minimální verze iOS pro simulátor
if #available(iOS 18.0, *) {
print("API iOS 18 dostupná")
}Porozumění rozdílům mezi simulátorem a skutečným zařízením je klíčové pro kvalitní testování. Hlavní rozdíly spočívají v architektuře procesoru, hardwarových možnostech a výkonu grafiky.
| Vlastnost | Simulátor | Skutečné zařízení |
|---|---|---|
| Architektura CPU | x86_64 / arm64 (Mac) | ARM64 (Apple Silicon) |
| GPU Metal | Simulace přes GPU Mac | Nativní Apple GPU |
| Kamera | Nedostupná | Plná |
| Akcelerometr/Gyroskop | Nedostupné | Hardwarové senzory |
| Touch ID / Face ID | Simulace přes menu | Hardwarová biometrie |
| Push oznámení | Od Xcode 11.4 (soubor .apns) | APNs server |
| Bluetooth LE | Nepodporováno | Plný stack |
Výkon v simulátoru je obvykle vyšší než na skutečném zařízení, protože využívá výkonný procesor Macu. To vytváří falešný dojem rychlosti. Animace, práce s Core Data a síťové požadavky na skutečném zařízení mohou fungovat pomaleji.
Před vydáním aplikaci povinně spusťte na skutečném zařízení. Kritické scénáře: kamera a AVFoundation, Bluetooth a CoreBluetooth, push oznámení přes APNs, práce se souborovým systémem v App Sandbox, výkon grafiky v Metal a spotřeba energie baterie.
Pro podmíněnou kompilaci kódu pro simulátor Apple poskytuje TARGET_OS_SIMULATOR v Objective-C a targetEnvironment(simulator) ve Swiftu. Tato kontrola umožňuje přidání debugovacích logů, mock objektů nebo vypnutí kódu závislého na hardwaru.
import UIKit
class CameraViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
#if targetEnvironment(simulator)
showMockCameraPreview()
print("Simulátor: používáme mock kameru")
#else
setupRealCameraSession()
#endif
}
}V Objective-C direktiva #if TARGET_OS_SIMULATOR funguje podobně. Použijte ji k vypnutí kódu, který vyžaduje hardwarové senzory nebo kameru. Ve fázi kompilace pro simulátor se tento kód nedostane do binárního souboru.
#if TARGET_OS_SIMULATOR
NSLog(@"Spuštění v simulátoru — kamera nedostupná");
self.cameraButton.hidden = YES;
#else
self.cameraButton.hidden = NO;
#endifKontrola TARGET_OS_SIMULATOR se aplikuje ve třech případech: nahrazení kamery mock objektem při UI testech, vypnutí Core Bluetooth pro urychlení vývoje a logování debugovacích informací, které by se neměly dostat do vydání. Vyhněte se použití kontroly ke změně obchodní logiky — to může vést k chybám na skutečném zařízení.
Xcode Simulator podporuje plnou sadu testů XCTest: unit testy (XCTestCase), UI testy (XCUITestCase) a výkonnostní testy. Pro testování na simulátoru není vyžadován podepsaný vývojářský certifikát, což zjednodušuje konfiguraci CI/CD.
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)
}
}Pro spouštění testů z příkazového řádku použijte xcodebuild test s uvedením schématu a simulátoru. Parametr -destination určuje konkrétní simulátor, na kterém budou testy spuštěny.
# Spouštění unit testů na simulátoru iPhone 16, iOS 18
xcodebuild test \
-scheme "MyApp" \
-destination "platform=iOS Simulator,name=iPhone 16,OS=18.0" \
-testPlan "AllTests"Navzdory pohodlí má Xcode Simulator řadu omezení, která mohou vést k chybám na skutečném zařízení. Nejkritičtější je absence emulace ARM: kód je kompilován pod architekturou hostitele a chování některých operací se může lišit.
Core Data a souborový systém pracují na simulátoru rychleji kvůli SSD Macu. Na skutečném zařízení s pamětí NAND je rychlost čtení/zápisu nižší. Testujte výkon Core Data na zařízení před vydáním, zejména pro velké datové sady.
Kontrola spotřeby energie na simulátoru je nemožná — simulátor je napájen z Macu. Režimy na pozadí, včetně načítání obsahu a fetch operací, se chovají na skutečném zařízení jinak kvůli omezením baterie a Background Task Scheduler.
Simulátor nemá přístup k hardwarovým senzorům iPhone. Face ID a Touch ID lze simulovat přes menu simulátoru: Features → Face ID → Matching Face. Akcelerometr, gyroskop a barometr nejsou k dispozici — kód spoléhající na CMDeviceMotion je třeba testovat na zařízení. Pro Core Location lze nastavit souřadnice přes Debug → Simulate Location s výběrem GPX souboru.
Kontrola iCloud a StoreKit na simulátoru je také omezená. StoreKit Test umožňuje simulovat nákupy bez skutečného App Store Connect, ale kontrola Sandbox prostředí a produkčních nákupů vyžaduje fyzické zařízení. Synchronizace iCloud Drive a CloudKit v simulátoru nefunguje správně — Apple doporučuje testovat tyto scénáře pouze na skutečných zařízeních.
Na Macu s procesory řady M funguje simulátor zásadně jinak: kód je kompilován do nativního ARM64, jako na skutečném iPhone, nikoli do x86_64. To výrazně snižuje propast mezi simulátorem a zařízením. Aplikace spuštěné na Apple Silicon simulátoru používají stejné ARM instrukce jako na fyzickém iPhone, což činí výkonnostní testy reprezentativnějšími. Rozdíl ve výkonu Metal a Core Animation mezi simulátorem řady M a skutečným iPhone je minimální ve srovnání s Intel simulátorem.
Konfigurace simulátoru pro CI vyžaduje předchozí vytvoření požadovaného zařízení a verze iOS. Na Continuous Integration serverech se simulátory nevytvářejí automaticky — je třeba je přidat přes xcrun simctl create před spuštěním testů.
# Vytvoření simulátoru pro CI
xcrun simctl create \
"iPhone 16 CI" \
"com.apple.CoreSimulator.SimDeviceType.iPhone-16" \
"com.apple.CoreSimulator.SimRuntime.iOS-18-0"
# Spouštění testů na vytvořeném simulátoru
xcodebuild test \
-workspace MyApp.xcworkspace \
-scheme MyApp \
-destination "id=$(xcrun simctl list devices | grep 'iPhone 16 CI' | awk -F'[][]' '{print }')"Pro paralelní testování na CI nakonfigurujte několik simulátorů s různými verzemi iOS. Xcode Cloud, GitHub Actions a Bitrise podporují paralelní spouštění testů, což zkracuje dobu běhu 2-3krát. Ujistěte se, že na CI serveru jsou nainstalovány všechny potřebné iOS simulátory pro testování.
Často kladené otázky
Simulátor pracuje na architektuře x86_64 a používá CPU Macu, zatímco skutečné zařízení pracuje na ARM64 Apple Silicon. Simulátor neemuluje kameru, senzory, GPU Metal, Bluetooth LE a baterii. Kód je kompilován pod architekturou hostitele, proto výkonnostní testy na simulátoru nejsou reprezentativní.
Použijte #if targetEnvironment(simulator) ve Swiftu nebo #if TARGET_OS_SIMULATOR v Objective-C. Jsou to direktivy podmíněné kompilace: kód v bloku se provádí pouze v simulátoru. Užitečné pro mock objekty kamery a debugovací logy nedostupné na skutečném zařízení.
Ano, od Xcode 11.4 simulátor podporuje simulaci push oznámení pomocí .apns souboru s JSON strukturou. Přetáhněte soubor na spuštěný simulátor nebo použijte příkaz xcrun simctl push. Oznámení se zobrazují plně jako na skutečném zařízení.
Simulátor nepodporuje kameru, mikrofon, akcelerometr, gyroskop, TrueDepth, Touch ID (kromě simulace), Face ID (kromě simulace), Bluetooth LE a NFC. Výkon Metal je simulován na GPU Macu, což neodráží skutečný výkon iPhone. Spotřeba energie nelze změřit.
Vytvořte simulátor přes xcrun simctl create, poté spusťte xcodebuild test s parametrem -destination určujícím platform=iOS Simulator a název zařízení. Pro paralelní testování vytvořte několik simulátorů s různými verzemi iOS v konfiguraci CI.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také