Xcode Simulator — ابزار داخلی اپل که برنامههای iOS را بدون دستگاه فیزیکی روی مک اجرا میکند. شبیهساز کد را تحت معماری x86_64 میزبان کامپایل میکند که سرعت بالای تست را تضمین میکند. مستندات اپل چرخه کامل دیباگ با استفاده از شبیهساز برای iPhone، iPad، Apple Watch و Apple TV را شرح میدهد.
نکات اصلی
Xcode Simulator — ابزاری برای اجرا و دیباگ برنامههای iOS مستقیماً روی مک. برخلاف شبیهساز اندروید، شبیهساز اپل پردازنده ARM دستگاه را شبیهسازی نمیکند. در عوض، کد به کد ماشین معماری میزبان کامپایل میشود (x86_64 در Intel Mac یا arm64 در Apple Silicon).
شبیهساز از فریمورکهای iOS مستقیماً از SDK استفاده میکند و دسترسی به UIKit، SwiftUI، Foundation و Core Data را فراهم میکند. طبق گزارش اپل (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("API iOS 18 در دسترس است")
}درک تفاوتهای بین شبیهساز و دستگاه واقعی برای تست باکیفیت حیاتی است. تفاوتهای اصلی در معماری پردازنده، قابلیتهای سختافزاری و عملکرد گرافیک نهفته است.
| ویژگی | شبیهساز | دستگاه واقعی |
|---|---|---|
| معماری 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 | پشتیبانی نمیشود | پشته کامل |
عملکرد در شبیهساز معمولاً بالاتر از دستگاه واقعی است، زیرا از پردازنده قدرتمند مک استفاده میکند. این امر احساس کاذب سرعت را ایجاد میکند. انیمیشنها، کار با Core Data و درخواستهای شبکه در دستگاه واقعی ممکن است کندتر کار کنند.
قبل از انتشار، حتماً برنامه را روی دستگاه واقعی اجرا کنید. سناریوهای بحرانی: دوربین و AVFoundation، بلوتوث و CoreBluetooth، اعلانهای push از طریق APNs، کار با سیستم فایل در App Sandbox، عملکرد گرافیک در Metal و مصرف انرژی باتری.
برای کامپایل شرطی کد برای شبیهساز، اپل 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 پشتیبانی میکند: تستهای واحد (XCTestCase)، تستهای UI (XCUITestCase) و تستهای عملکرد. برای تست در شبیهساز به گواهی توسعهدهنده امضا شده نیاز نیست که پیکربندی 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 شبیهساز مشخصی را تعیین میکند که تستها روی آن اجرا میشوند.
# اجرای تستهای واحد روی شبیهساز 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 مک در شبیهساز سریعتر کار میکنند. در دستگاه واقعی با حافظه NAND سرعت خواندن/نوشتن کمتر است. عملکرد Core Data را قبل از انتشار روی دستگاه تست کنید، بهویژه برای مجموعه دادههای بزرگ.
بررسی مصرف انرژی در شبیهساز غیرممکن است — شبیهساز از مک تغذیه میکند. حالتهای پسزمینه، از جمله بارگیری محتوا و عملیات 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 و خریدهای تولیدی نیاز به دستگاه فیزیکی دارد. همگامسازی iCloud Drive و CloudKit در شبیهساز به درستی کار نمیکند — اپل توصیه میکند این سناریوها را فقط روی دستگاههای واقعی تست کنید.
در مک با پردازندههای سری M، شبیهساز اساساً متفاوت کار میکند: کد به ARM64 بومی کامپایل میشود، مانند iPhone واقعی، نه x86_64. این شکاف بین شبیهساز و دستگاه را به طور قابل توجهی کاهش میدهد. برنامههای اجرا شده روی شبیهساز Apple Silicon از همان دستورالعملهای ARM استفاده میکنند که در iPhone فیزیکی، که تستهای عملکرد را نمایندهتر میکند. تفاوت عملکرد 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 از اجرای موازی تستها پشتیبانی میکنند که زمان اجرا را ۲-۳ برابر کاهش میدهد. اطمینان حاصل کنید که تمام شبیهسازهای iOS لازم برای تست روی سرور CI نصب شدهاند.
سوالات متداول
شبیهساز روی معماری x86_64 کار میکند و از CPU مک استفاده میکند، در حالی که دستگاه واقعی روی ARM64 Apple Silicon کار میکند. شبیهساز دوربین، سنسورها، GPU Metal، Bluetooth LE و باتری را شبیهسازی نمیکند. کد تحت معماری میزبان کامپایل میشود، بنابراین تستهای عملکرد در شبیهساز نماینده نیستند.
از #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 مک شبیهسازی میشود که عملکرد واقعی iPhone را منعکس نمیکند. اندازهگیری مصرف انرژی غیرممکن است.
شبیهساز را از طریق xcrun simctl create ایجاد کنید، سپس xcodebuild test را با پارامتر -destination که platform=iOS Simulator و نام دستگاه را مشخص میکند اجرا کنید. برای تست موازی، چندین شبیهساز با نسخههای مختلف iOS در پیکربندی CI ایجاد کنید.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.