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 frameworke директно из 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-у. Ова провера омогућава додавање debug логова, mock објеката или искључивање хардверски зависног кода.

swift
import UIKit

class CameraViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        #if targetEnvironment(simulator)
        showMockCameraPreview()
        print("Симулатор: користимо mock камеру")
        #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 примењује се у три случаја: замена камере mock објектом при UI тестовима, искључивање Core Bluetooth-а за убрзање развоја и логирање debug информација које не треба да уђу у издање. Избегавајте коришћење провере за промену пословне логике — то може довести до грешака на правом уређају.

Покретање тестова у симулатору

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 препоручује тестирање ових сценарија само на правим уређајима.

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

На Mac-у са процесорима M серије, симулатор ради фундаментално другачије: код се компајлира у изворни ARM64, као на правом iPhone-у, а не у x86_64. Ово значајно смањује јаз између симулатора и уређаја. Апликације покренуте на Apple Silicon симулатору користе исте ARM инструкције као на физичком iPhone-у, што чини performance тестове репрезентативнијим. Разлика у перформансама Metal-а и Core Animation-а између M серије симулатора и правог iPhone-а је минимална у поређењу са Intel симулатором.

Подешавање симулатора за CI

Подешавање симулатора за CI захтева претходно креирање потребног уређаја и верзије iOS-а. На Continuous Integration серверима, симулатори се не креирају аутоматски — морају се додати путем 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-у. Ово су директиве условног компајлирања: код у блоку се извршава само у симулатору. Погодно за mock објекте камере и debug логове недоступне на правом уређају.

Могу ли се тестирати 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) омогућавају додавање mock објеката и debug логова
  • Тестирање — XCTest подржава unit, UI и performance тестове на симулатору без програмерског сертификата
  • CI подешавање — креирајте симулаторе путем xcrun simctl и покрећите паралелне тестове на више верзија iOS-а
  • Критични сценарији — камера, Bluetooth, push обавештења и перформансе Metal-а захтевају тестирање на правом уређају
  • Apple Silicon Mac — симулатор на M серији покреће iOS апликације са минималним архитектурним разликама

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође