Xcode Simulator, fiziksel bir cihaz olmadan Mac'te iOS uygulamalarını çalıştıran yerleşik bir Apple aracıdır. Simülatör, kodu ana bilgisayarın x86_64 mimarisi için derleyerek yüksek test hızı sağlar. Apple Belgeleri, iPhone, iPad, Apple Watch ve Apple TV için simülatör kullanarak tam hata ayıklama döngüsünü açıklar.
Önemli Noktalar
Xcode Simulator, Mac'te doğrudan iOS uygulamalarını çalıştırmak ve hata ayıklamak için bir araçtır. Android öykünücüsünden farklı olarak, Apple simülatörü cihazın ARM işlemcisini öykünmez. Bunun yerine, kod ana bilgisayar mimarisinin (Intel Mac'te x86_64 veya Apple Silicon'da arm64) makine koduna derlenir.
Simülatör, SDK'dan doğrudan iOS çerçevelerini kullanarak UIKit, SwiftUI, Foundation ve Core Data'ya erişim sağlar. Apple'a (WWDC 2024) göre, geliştiricilerin %90'ından fazlası geliştirme aşamasında simülatörü kullanır ve fiziksel cihazları yalnızca son testler için bağlar.
Xcode'un her sürümü, farklı cihaz modelleri ve iOS sürümleri için bir dizi simülatör içerir. Örneğin, Xcode 16, iOS 18 ile iPhone 16 Pro, iPadOS 18 ile iPad Pro M4, Apple Watch Series 10 ve Apple TV 4K için simülatörler içerir.
Simülatör, Mac App Store'dan Xcode ile birlikte kurulur. Ek iOS sürümleri eklemek için Settings → Platforms menüsünü kullanın. Derleme şemasında (Scheme) bir simülatör seçin ve Run'a basın. Alternatif olarak, Xcode → Open Developer Tool → Simulator menüsü aracılığıyla simülatörü başlatın.
// Simülatör için minimum iOS sürümü kontrolü
if #available(iOS 18.0, *) {
print("iOS 18 API'leri mevcut")
}Simülatör ve gerçek cihaz arasındaki farkları anlamak, kaliteli test için son derece önemlidir. Temel farklılıklar işlemci mimarisi, donanım yetenekleri ve grafik performansında yatmaktadır.
| Özellik | Simülatör | Gerçek cihaz |
|---|---|---|
| CPU Mimarisi | x86_64 / arm64 (Mac) | ARM64 (Apple Silicon) |
| GPU Metal | Mac GPU üzerinden simülasyon | Yerel Apple GPU |
| Kamera | Kullanılamaz | Tam |
| İvmeölçer/Jiroskop | Kullanılamaz | Donanım sensörleri |
| Touch ID / Face ID | Menü üzerinden simülasyon | Donanım biyometrisi |
| Push bildirimleri | Xcode 11.4'ten itibaren (.apns dosyası) | APNs sunucusu |
| Bluetooth LE | Desteklenmez | Tam yığın |
Simülatördeki performans genellikle gerçek bir cihazdan daha yüksektir çünkü Mac'in güçlü işlemcisini kullanır. Bu, hız konusunda yanlış bir izlenim yaratır. Gerçek bir cihazda animasyonlar, Core Data işlemleri ve ağ istekleri daha yavaş çalışabilir.
Sürümden önce uygulamayı gerçek bir cihazda çalıştırdığınızdan emin olun. Kritik senaryolar: kamera ve AVFoundation, Bluetooth ve CoreBluetooth, APNs aracılığıyla push bildirimleri, App Sandbox'ta dosya sistemi işlemleri, Metal'de grafik performansı ve pil gücü tüketimi.
Simülatör için kodun koşullu derlemesi amacıyla Apple, Objective-C'de TARGET_OS_SIMULATOR ve Swift'te targetEnvironment(simulator) sağlar. Bu kontrol, hata ayıklama günlükleri, sahte nesneler eklemenize veya donanıma bağımlı kodu devre dışı bırakmanıza olanak tanır.
import UIKit
class CameraViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
#if targetEnvironment(simulator)
showMockCameraPreview()
print("Simülatör: sahte kamera kullanma")
#else
setupRealCameraSession()
#endif
}
}Objective-C'de #if TARGET_OS_SIMULATOR yönergesi benzer şekilde çalışır. Donanım sensörleri veya kamera gerektiren kodu devre dışı bırakmak için kullanın. Simülatör için derleme aşamasında bu kod ikili dosyaya girmez.
#if TARGET_OS_SIMULATOR
NSLog(@"Simülatörde çalışıyor — kamera kullanılamaz");
self.cameraButton.hidden = YES;
#else
self.cameraButton.hidden = NO;
#endifTARGET_OS_SIMULATOR kontrolü üç durumda kullanılır: UI testleri sırasında kamerayı sahte bir nesneyle değiştirmek, geliştirmeyi hızlandırmak için Core Bluetooth'u devre dışı bırakmak ve sürüm yapısına girmemesi gereken hata ayıklama bilgilerini günlüğe kaydetmek. İş mantığını değiştirmek için kontrolü kullanmaktan kaçının — bu, gerçek bir cihazda hatalara yol açabilir.
Xcode Simulator, tam XCTest test paketini destekler: birim testleri (XCTestCase), UI testleri (XCUITestCase) ve performans testleri. Simülatörde test yapmak, imzalı bir geliştirici sertifikası gerektirmez ve bu da CI/CD kurulumunu basitleştirir.
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)
}
}Komut satırından test çalıştırmak için, şema ve simülatörü belirterek xcodebuild test kullanın. -destination parametresi, testlerin üzerinde çalıştırılacağı belirli simülatörü tanımlar.
# iPhone 16 Simülatörü, iOS 18'de birim testleri çalıştırma
xcodebuild test \
-scheme "MyApp" \
-destination "platform=iOS Simulator,name=iPhone 16,OS=18.0" \
-testPlan "AllTests"Kolaylığına rağmen, Xcode Simulator gerçek bir cihazda hatalara yol açabilecek bir dizi sınırlamaya sahiptir. En kritik olanı ARM öykünmesinin olmamasıdır: kod ana bilgisayar mimarisi için derlenir ve bazı işlemlerin davranışı farklılık gösterebilir.
Core Data ve dosya sistemi, Mac'in SSD'si sayesinde simülatörde daha hızlı çalışır. NAND belleğe sahip gerçek bir cihazda okuma/yazma hızı daha düşüktür. Sürümden önce, özellikle büyük veri kümeleri için cihazda Core Data performansını test edin.
Simülatörde güç tüketimini kontrol etmek imkansızdır — simülatör Mac'ten güç alır. İçerik yükleme ve getirme işlemleri dahil arka plan modları, pil sınırlamaları ve Background Task Scheduler nedeniyle gerçek bir cihazda farklı davranır.
Simülatörün iPhone'un donanım sensörlerine erişimi yoktur. Face ID ve Touch ID, simülatör menüsü aracılığıyla simüle edilebilir: Features → Face ID → Matching Face. İvmeölçer, jiroskop ve barometre kullanılamaz — CMDeviceMotion'a bağlı kodun bir cihazda test edilmesi gerekir. Core Location için, bir GPX dosyası seçerek Debug → Simulate Location aracılığıyla koordinatlar ayarlayabilirsiniz.
Simülatörde iCloud ve StoreKit kontrolü de sınırlıdır. StoreKit Test, gerçek App Store Connect olmadan satın almaları simüle etmeye izin verir, ancak Sandbox ortamı ve üretim satın almalarının kontrolü fiziksel bir cihaz gerektirir. Simülatörde iCloud Drive ve CloudKit senkronizasyonu hatalı çalışır — Apple bu senaryoların yalnızca gerçek cihazlarda test edilmesini önerir.
M serisi işlemcili Mac'lerde simülatör temelde farklı çalışır: kod, x86_64 yerine yerel ARM64 olarak derlenir (gerçek iPhone'da olduğu gibi). Bu, simülatör ve cihaz arasındaki boşluğu önemli ölçüde azaltır. Apple Silicon simülatöründe çalışan uygulamalar, fiziksel bir iPhone ile aynı ARM talimatlarını kullanır ve bu da performans testlerini daha temsil edici hale getirir. M serisi simülatör ile gerçek iPhone arasındaki Metal ve Core Animation performansı farkı, Intel simülatörüne kıyasla minimumdur.
CI için simülatör kurulumu, gerekli cihazın ve iOS sürümünün önceden oluşturulmasını gerektirir. Sürekli entegrasyon sunucularında simülatörler otomatik olarak oluşturulmaz — testleri çalıştırmadan önce xcrun simctl create aracılığıyla eklenmeleri gerekir.
# CI için simülatör oluşturma
xcrun simctl create \
"iPhone 16 CI" \
"com.apple.CoreSimulator.SimDeviceType.iPhone-16" \
"com.apple.CoreSimulator.SimRuntime.iOS-18-0"
# Oluşturulan simülatörde test çalıştırma
xcodebuild test \
-workspace MyApp.xcworkspace \
-scheme MyApp \
-destination "id=$(xcrun simctl list devices | grep 'iPhone 16 CI' | awk -F'[][]' '{print }')"CI'da paralel test için, farklı iOS sürümlerine sahip birden çok simülatör yapılandırın. Xcode Cloud, GitHub Actions ve Bitrise paralel test yürütmeyi destekleyerek çalışma süresini 2-3 kat azaltır. CI sunucusunda test için gerekli tüm iOS simülatörlerinin kurulu olduğundan emin olun.
Sıkça Sorulan Sorular
Simülatör x86_64 mimarisinde çalışır ve Mac CPUsunu kullanır, gerçek cihaz ise ARM64 Apple Silicon'da çalışır. Simülatör kamera, sensörler, GPU Metal, Bluetooth LE ve pili öykünmez. Kod ana bilgisayar mimarisi için derlenir, bu nedenle simülatördeki performans testleri temsil edici değildir.
Swift'te #if targetEnvironment(simulator) veya Objective-C'de #if TARGET_OS_SIMULATOR kullanın. Bunlar koşullu derleme yönergeleridir: bloktaki kod yalnızca simülatörde yürütülür. Gerçek bir cihazda bulunmayan kamera sahte nesneleri ve hata ayıklama günlükleri için kullanışlıdır.
Evet, Xcode 11.4 itibarıyla simülatör, JSON yapısına sahip bir .apns dosyası aracılığıyla push bildirimi simülasyonunu destekler. Dosyayı çalışan simülatöre sürükleyin veya xcrun simctl push komutunu kullanın. Bildirimler gerçek bir cihazdaki gibi tamamen görüntülenir.
Simülatör kamera, mikrofon, ivmeölçer, jiroskop, TrueDepth, Touch ID (simülasyon hariç), Face ID (simülasyon hariç), Bluetooth LE ve NFC'yi desteklemez. Metal performansı Mac GPU'sunda simüle edilir, bu gerçek iPhone performansını yansıtmaz. Güç tüketimi ölçülemez.
xcrun simctl create ile bir simülatör oluşturun, ardından platform=iOS Simulator ve cihaz adını belirten -destination parametresiyle xcodebuild test çalıştırın. Paralel test için, CI yapılandırmasında farklı iOS sürümlerine sahip birden çok simülatör oluşturun.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun