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 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.
// Провера минималне верзије 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-у. Ова провера омогућава додавање debug логова, mock објеката или искључивање хардверски зависног кода.
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 ради слично. Користите је за искључивање кода који захтева хардверске сензоре или камеру. У фази компајлирања за симулатор, овај код не улази у бинарну датотеку.
#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-а.
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-а. На Continuous Integration серверима, симулатори се не креирају аутоматски — морају се додати путем 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-у. Ово су директиве условног компајлирања: код у блоку се извршава само у симулатору. Погодно за mock објекте камере и debug логове недоступне на правом уређају.
Да, почев од 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. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође