iOS Simulator: що це таке і як працює в Xcode

Автор: IT Sectr Опубліковано: 2026-02-09 Час читання: 8 хв

Xcode Simulator — вбудований інструмент Apple, який запускає iOS-додатки на Mac без фізичного пристрою. Симулятор компілює код під архітектуру x86_64 хоста, що забезпечує високу швидкість тестування. Документація Apple описує повний цикл налагодження з використанням симулятора для iPhone, iPad, Apple Watch та Apple TV.

Головне

  • Xcode Simulator — емуляція iOS-пристрою на рівні додатків без повної емуляції ARM-архітектури
  • Різниця з реальним пристроєм — симулятор не підтримує камеру, GPU Metal, датчики та push-сповіщення (до Xcode 11.4)
  • TARGET_OS_SIMULATOR — директива для перевірки середовища виконання в коді Objective-C та Swift
  • Unit-тести та UI-тести — симулятор підтримує повний набір XCTest з можливістю запуску на CI серверах
  • Декілька платформ — симулятор підтримує iPhone, iPad, Apple Watch, Apple TV та Vision Pro

Що таке Simulator в Xcode?

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.

swift
// Перевірка мінімальної версії iOS для симулятора
if #available(iOS 18.0, *) {
    print("iOS 18 API доступні")
}

Відмінності симулятора від реального пристрою

Розуміння відмінностей між симулятором та реальним пристроєм критично важливе для якісного тестування. Основні відмінності полягають в архітектурі процесора, апаратних можливостях та продуктивності графіки.

ХарактеристикаСимуляторРеальний пристрій
Архітектура CPUx86_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 та енергоспоживання батареї.

Перевірка TARGET_OS_SIMULATOR в коді

Для умовної компіляції коду під симулятор Apple надає TARGET_OS_SIMULATOR в Objective-C та targetEnvironment(simulator) в Swift. Ця перевірка дозволяє додати налагоджувальні логи, мок-об'єкти або вимкнути апаратно-залежний код.

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 працює аналогічно. Використовуйте її для вимкнення коду, який потребує апаратних датчиків або камери. На етапі компіляції для симулятора цей код не потрапляє в бінарний файл.

objective-c
#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.

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

Для запуску тестів з командного рядка використовуйте xcodebuild test із зазначенням схеми та симулятора. Параметр -destination визначає конкретний симулятор, на якому будуть запущені тести.

bash
# Запуск 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 рекомендує тестувати ці сценарії лише на реальних пристроях.

Симулятор на Apple Silicon Mac

На Mac з процесорами M-серії симулятор працює принципово інакше: код компілюється в нативний ARM64, як на реальному iPhone, а не в x86_64. Це суттєво скорочує розрив між симулятором та пристроєм. Додатки, запущені на симуляторі Apple Silicon, використовують ті ж ARM-інструкції, що й на фізичному iPhone, що робить performance-тести більш репрезентативними. Різниця в продуктивності Metal та Core Animation між симулятором M-серії та реальним iPhone мінімальна порівняно з Intel-симулятором.

Налаштування симулятора для CI

Налаштування симулятора для CI потребує попереднього створення потрібного пристрою та версії iOS. На серверах безперервної інтеграції симулятори не створюються автоматично — їх потрібно додати через xcrun simctl create перед запуском тестів.

bash
# Створення симулятора для 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 для тестування.

Часті запитання

Чим симулятор Xcode відрізняється від реального пристрою?

Симулятор працює на архітектурі x86_64 і використовує CPU Mac, а реальний пристрій — на ARM64 Apple Silicon. Симулятор не емулює камеру, датчики, GPU Metal, Bluetooth LE та батарею. Код компілюється під архітектуру хоста, тому performance-тести на симуляторі не репрезентативні.

Як перевірити в коді, чи запущено додаток у симуляторі?

Використовуйте #if targetEnvironment(simulator) в Swift або #if TARGET_OS_SIMULATOR в Objective-C. Це директиви умовної компіляції: код у блоці виконується тільки в симуляторі. Зручно для мок-об'єктів камери та налагоджувальних логів, недоступних на реальному пристрої.

Чи можна тестувати push-сповіщення в симуляторі?

Так, починаючи з Xcode 11.4, симулятор підтримує симуляцію push-сповіщень через файл .apns з JSON-структурою. Перетягніть файл на запущений симулятор або використовуйте команду xcrun simctl push. Сповіщення відображаються повністю як на реальному пристрої.

Які обмеження має Xcode Simulator?

Симулятор не підтримує камеру, мікрофон, акселерометр, гіроскоп, TrueDepth, Touch ID (крім симуляції), Face ID (крім симуляції), Bluetooth LE та NFC. Продуктивність Metal симулюється на GPU Mac, що не відображає реальної продуктивності iPhone. Енергоспоживання виміряти неможливо.

Як запустити тести на CI з використанням симулятора?

Створіть симулятор через xcrun simctl create, потім запустіть xcodebuild test з параметром -destination, що вказує platform=iOS Simulator та ім'я пристрою. Для паралельного тестування створіть кілька симуляторів з різними версіями iOS у конфігурації CI.

Підсумки

  • Xcode Simulator — інструмент для запуску iOS-додатків на Mac, що компілює код під архітектуру хоста без ARM-емуляції
  • Відмінності від пристрою — симулятор не підтримує камеру, GPU Metal, датчики, Bluetooth, NFC та не дає репрезентативної продуктивності
  • Умовна компіляція — TARGET_OS_SIMULATOR та targetEnvironment(simulator) дозволяють додати мок-об'єкти та налагоджувальні логи
  • Тестування — XCTest підтримує Unit, UI та performance тести на симуляторі без сертифіката розробника
  • CI налаштування — створюйте симулятори через xcrun simctl та запускайте паралельні тести на декількох версіях iOS
  • Критичні сценарії — камера, Bluetooth, push-сповіщення та продуктивність Metal потребують тестування на реальному пристрої
  • Apple Silicon Mac — симулятор на M-серії запускає iOS-додатки з мінімальними відмінностями в архітектурі

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також