Xcode Simulator — вбудований інструмент Apple, який запускає iOS-додатки на Mac без фізичного пристрою. Симулятор компілює код під архітектуру x86_64 хоста, що забезпечує високу швидкість тестування. Документація Apple описує повний цикл налагодження з використанням симулятора для iPhone, iPad, Apple Watch та Apple TV.
Головне
Xcode Simulator — інструмент для запуску та налагодження iOS-додатків безпосередньо на Mac. На відміну від емулятора Android, симулятор Apple не емулює ARM-процесор пристрою. Замість цього код компілюється в машинний код архітектури хоста (x86_64 на Intel Mac або arm64 на Apple Silicon).
Симулятор використовує фреймворки iOS безпосередньо з SDK, надаючи доступ до UIKit, SwiftUI, Foundation та Core Data. За даними Apple (WWDC 2024), понад 90% розробників використовують симулятор на етапі розробки, підключаючи фізичні пристрої лише для фінального тестування.
Кожна версія Xcode включає набір симуляторів для різних моделей пристроїв та версій iOS. Наприклад, Xcode 16 містить симулятори iPhone 16 Pro з iOS 18, iPad Pro M4 з iPadOS 18, Apple Watch Series 10 та Apple TV 4K.
Симулятор встановлюється разом з Xcode з Mac App Store. Для додавання додаткових версій iOS використовуйте меню Settings → Platforms. Виберіть симулятор у схемі збірки (Scheme) та натисніть Run. Або запустіть симулятор через меню Xcode → Open Developer Tool → Simulator.
// Перевірка мінімальної версії iOS для симулятора
if #available(iOS 18.0, *) {
print("iOS 18 API доступні")
}Розуміння відмінностей між симулятором та реальним пристроєм критично важливе для якісного тестування. Основні відмінності полягають в архітектурі процесора, апаратних можливостях та продуктивності графіки.
| Характеристика | Симулятор | Реальний пристрій |
|---|---|---|
| Архітектура CPU | x86_64 / arm64 (Mac) | ARM64 (Apple Silicon) |
| GPU Metal | Симуляція через GPU Mac | Нативний Apple GPU |
| Камера | Недоступна | Повноцінна |
| Акселерометр/Гіроскоп | Недоступні | Апаратні датчики |
| Touch ID / Face ID | Симуляція через меню | Апаратна біометрія |
| Push-сповіщення | З Xcode 11.4 (файл .apns) | APNs сервер |
| Bluetooth LE | Не підтримується | Повноцінний стек |
Продуктивність у симуляторі зазвичай вища, ніж на реальному пристрої, оскільки використовується потужний процесор Mac. Це створює хибне відчуття швидкодії. Анімації, робота з Core Data та мережеві запити на реальному пристрої можуть працювати повільніше.
Обов'язково запускайте додаток на реальному пристрої перед релізом. Критичні сценарії: камера та AVFoundation, Bluetooth та CoreBluetooth, push-сповіщення через APNs, робота з файловою системою в App Sandbox, продуктивність графіки в Metal та енергоспоживання батареї.
Для умовної компіляції коду під симулятор Apple надає TARGET_OS_SIMULATOR в Objective-C та targetEnvironment(simulator) в Swift. Ця перевірка дозволяє додати налагоджувальні логи, мок-об'єкти або вимкнути апаратно-залежний код.
import UIKit
class CameraViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
#if targetEnvironment(simulator)
showMockCameraPreview()
print("Симулятор: використовуємо мок-камеру")
#else
setupRealCameraSession()
#endif
}
}В Objective-C директива #if TARGET_OS_SIMULATOR працює аналогічно. Використовуйте її для вимкнення коду, який потребує апаратних датчиків або камери. На етапі компіляції для симулятора цей код не потрапляє в бінарний файл.
#if TARGET_OS_SIMULATOR
NSLog(@"Запуск у симуляторі — камера недоступна");
self.cameraButton.hidden = YES;
#else
self.cameraButton.hidden = NO;
#endifПеревірка TARGET_OS_SIMULATOR застосовується в трьох випадках: заміна камери мок-об'єктом при UI-тестах, вимкнення Core Bluetooth для прискорення розробки та логування налагоджувальної інформації, яка не повинна потрапити в релізну збірку. Уникайте використання перевірки для зміни бізнес-логіки — це може призвести до багів на реальному пристрої.
Xcode Simulator підтримує повний набір тестів XCTest: Unit-тести (XCTestCase), UI-тести (XCUITestCase) та performance-тести. Для тестування на симуляторі не потрібен підписаний сертифікат розробника, що спрощує налаштування 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)
}
}Для запуску тестів з командного рядка використовуйте xcodebuild test із зазначенням схеми та симулятора. Параметр -destination визначає конкретний симулятор, на якому будуть запущені тести.
# Запуск Unit-тестів на симуляторі iPhone 16, iOS 18
xcodebuild test \
-scheme "MyApp" \
-destination "platform=iOS Simulator,name=iPhone 16,OS=18.0" \
-testPlan "AllTests"Незважаючи на зручність, Xcode Simulator має ряд обмежень, які можуть призвести до багів на реальному пристрої. Найкритичніше — відсутність ARM-емуляції: код компілюється під архітектуру хоста, і поведінка деяких операцій може відрізнятися.
Core Data та файлова система працюють швидше на симуляторі через SSD Mac. На реальному пристрої з NAND-пам'яттю швидкість читання/запису нижча. Тестуйте продуктивність Core Data на пристрої перед релізом, особливо для великих наборів даних.
Перевірка енергоспоживання на симуляторі неможлива — симулятор живиться від Mac. Фонові режими, включаючи завантаження контенту та fetch-операції, поводяться інакше на реальному пристрої через обмеження батареї та Background Task Scheduler.
Симулятор не має доступу до апаратних датчиків iPhone. Face ID та Touch ID можна симулювати через меню симулятора: Features → Face ID → Matching Face. Акселерометр, гіроскоп та барометр недоступні — код, що покладається на CMDeviceMotion, потрібно тестувати на пристрої. Для Core Location можна встановити координати через Debug → Simulate Location з вибором GPX-файлу.
Перевірка iCloud та StoreKit на симуляторі також обмежена. StoreKit Test дозволяє симулювати покупки без реального App Store Connect, але перевірка Sandbox-середовища та production-покупок потребує фізичного пристрою. Синхронізація iCloud Drive та CloudKit на симуляторі працює некоректно — Apple рекомендує тестувати ці сценарії лише на реальних пристроях.
На Mac з процесорами M-серії симулятор працює принципово інакше: код компілюється в нативний ARM64, як на реальному iPhone, а не в x86_64. Це суттєво скорочує розрив між симулятором та пристроєм. Додатки, запущені на симуляторі Apple Silicon, використовують ті ж ARM-інструкції, що й на фізичному iPhone, що робить performance-тести більш репрезентативними. Різниця в продуктивності Metal та Core Animation між симулятором M-серії та реальним iPhone мінімальна порівняно з Intel-симулятором.
Налаштування симулятора для CI потребує попереднього створення потрібного пристрою та версії iOS. На серверах безперервної інтеграції симулятори не створюються автоматично — їх потрібно додати через xcrun simctl create перед запуском тестів.
# Створення симулятора для CI
xcrun simctl create \
"iPhone 16 CI" \
"com.apple.CoreSimulator.SimDeviceType.iPhone-16" \
"com.apple.CoreSimulator.SimRuntime.iOS-18-0"
# Запуск тестів на створеному симуляторі
xcodebuild test \
-workspace MyApp.xcworkspace \
-scheme MyApp \
-destination "id=$(xcrun simctl list devices | grep 'iPhone 16 CI' | awk -F'[][]' '{print }')"Для паралельного тестування на CI налаштуйте кілька симуляторів з різними версіями iOS. Xcode Cloud, GitHub Actions та Bitrise підтримують паралельний запуск тестів, що скорочує час прогону в 2-3 рази. Переконайтеся, що на CI-сервері встановлені всі необхідні симулятори iOS для тестування.
Часті запитання
Симулятор працює на архітектурі x86_64 і використовує CPU Mac, а реальний пристрій — на ARM64 Apple Silicon. Симулятор не емулює камеру, датчики, GPU Metal, Bluetooth LE та батарею. Код компілюється під архітектуру хоста, тому performance-тести на симуляторі не репрезентативні.
Використовуйте #if targetEnvironment(simulator) в Swift або #if TARGET_OS_SIMULATOR в Objective-C. Це директиви умовної компіляції: код у блоці виконується тільки в симуляторі. Зручно для мок-об'єктів камери та налагоджувальних логів, недоступних на реальному пристрої.
Так, починаючи з Xcode 11.4, симулятор підтримує симуляцію push-сповіщень через файл .apns з JSON-структурою. Перетягніть файл на запущений симулятор або використовуйте команду xcrun simctl push. Сповіщення відображаються повністю як на реальному пристрої.
Симулятор не підтримує камеру, мікрофон, акселерометр, гіроскоп, TrueDepth, Touch ID (крім симуляції), Face ID (крім симуляції), Bluetooth LE та NFC. Продуктивність Metal симулюється на GPU Mac, що не відображає реальної продуктивності iPhone. Енергоспоживання виміряти неможливо.
Створіть симулятор через xcrun simctl create, потім запустіть xcodebuild test з параметром -destination, що вказує platform=iOS Simulator та ім'я пристрою. Для паралельного тестування створіть кілька симуляторів з різними версіями iOS у конфігурації CI.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.