iOS Simulator: چیست و چگونه در Xcode کار می‌کند

نویسنده: IT Sectr منتشر شده: 2026-02-09 زمان مطالعه: 8 دقیقه

Xcode Simulator — ابزار داخلی اپل که برنامه‌های iOS را بدون دستگاه فیزیکی روی مک اجرا می‌کند. شبیه‌ساز کد را تحت معماری x86_64 میزبان کامپایل می‌کند که سرعت بالای تست را تضمین می‌کند. مستندات اپل چرخه کامل دیباگ با استفاده از شبیه‌ساز برای iPhone، iPad، Apple Watch و Apple TV را شرح می‌دهد.

نکات اصلی

  • Xcode Simulator — شبیه‌سازی دستگاه iOS در سطح برنامه بدون شبیه‌سازی کامل معماری ARM
  • تفاوت با دستگاه واقعی — شبیه‌ساز از دوربین، GPU Metal، سنسورها و اعلان‌های push پشتیبانی نمی‌کند (قبل از Xcode 11.4)
  • TARGET_OS_SIMULATOR — دستورالعمل برای بررسی محیط اجرا در کد Objective-C و Swift
  • تست‌های واحد و UI — شبیه‌ساز از مجموعه کامل XCTest با قابلیت اجرا روی سرورهای CI پشتیبانی می‌کند
  • چندین پلتفرم — شبیه‌ساز از iPhone، iPad، Apple Watch، Apple TV و Vision Pro پشتیبانی می‌کند

Simulator در Xcode چیست؟

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 اجرا کنید.

swift
// بررسی حداقل نسخه iOS برای شبیه‌ساز
if #available(iOS 18.0, *) {
    print("API iOS 18 در دسترس است")
}

تفاوت‌های شبیه‌ساز با دستگاه واقعی

درک تفاوت‌های بین شبیه‌ساز و دستگاه واقعی برای تست باکیفیت حیاتی است. تفاوت‌های اصلی در معماری پردازنده، قابلیت‌های سخت‌افزاری و عملکرد گرافیک نهفته است.

ویژگیشبیه‌سازدستگاه واقعی
معماری CPUx86_64 / arm64 (Mac)ARM64 (Apple Silicon)
GPU Metalشبیه‌سازی از طریق GPU MacApple 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 در کد

برای کامپایل شرطی کد برای شبیه‌ساز، اپل 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 پشتیبانی می‌کند: تست‌های واحد (XCTestCase)، تست‌های UI (XCUITestCase) و تست‌های عملکرد. برای تست در شبیه‌ساز به گواهی توسعه‌دهنده امضا شده نیاز نیست که پیکربندی 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
# اجرای تست‌های واحد روی شبیه‌ساز 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 در شبیه‌ساز به درستی کار نمی‌کند — اپل توصیه می‌کند این سناریوها را فقط روی دستگاه‌های واقعی تست کنید.

شبیه‌ساز در مک Apple Silicon

در مک با پردازنده‌های سری M، شبیه‌ساز اساساً متفاوت کار می‌کند: کد به ARM64 بومی کامپایل می‌شود، مانند iPhone واقعی، نه x86_64. این شکاف بین شبیه‌ساز و دستگاه را به طور قابل توجهی کاهش می‌دهد. برنامه‌های اجرا شده روی شبیه‌ساز Apple Silicon از همان دستورالعمل‌های ARM استفاده می‌کنند که در iPhone فیزیکی، که تست‌های عملکرد را نماینده‌تر می‌کند. تفاوت عملکرد 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 از اجرای موازی تست‌ها پشتیبانی می‌کنند که زمان اجرا را ۲-۳ برابر کاهش می‌دهد. اطمینان حاصل کنید که تمام شبیه‌سازهای iOS لازم برای تست روی سرور CI نصب شده‌اند.

سوالات متداول

شبیه‌ساز Xcode چه تفاوتی با دستگاه واقعی دارد؟

شبیه‌ساز روی معماری x86_64 کار می‌کند و از CPU مک استفاده می‌کند، در حالی که دستگاه واقعی روی ARM64 Apple Silicon کار می‌کند. شبیه‌ساز دوربین، سنسورها، GPU Metal، Bluetooth LE و باتری را شبیه‌سازی نمی‌کند. کد تحت معماری میزبان کامپایل می‌شود، بنابراین تست‌های عملکرد در شبیه‌ساز نماینده نیستند.

چگونه در کد بررسی کنیم که برنامه در شبیه‌ساز اجرا می‌شود؟

از #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 مک شبیه‌سازی می‌شود که عملکرد واقعی iPhone را منعکس نمی‌کند. اندازه‌گیری مصرف انرژی غیرممکن است.

چگونه تست‌ها را روی CI با استفاده از شبیه‌ساز اجرا کنیم؟

شبیه‌ساز را از طریق xcrun simctl create ایجاد کنید، سپس xcodebuild test را با پارامتر -destination که platform=iOS Simulator و نام دستگاه را مشخص می‌کند اجرا کنید. برای تست موازی، چندین شبیه‌ساز با نسخه‌های مختلف iOS در پیکربندی CI ایجاد کنید.

خلاصه

  • Xcode Simulator — ابزاری برای اجرای برنامه‌های iOS روی مک که کد را تحت معماری میزبان بدون شبیه‌سازی ARM کامپایل می‌کند
  • تفاوت با دستگاه — شبیه‌ساز از دوربین، GPU Metal، سنسورها، بلوتوث، NFC پشتیبانی نمی‌کند و عملکرد نماینده‌ای ارائه نمی‌دهد
  • کامپایل شرطی — TARGET_OS_SIMULATOR و targetEnvironment(simulator) امکان افزودن اشیاء شبیه‌سازی شده و لاگ‌های دیباگ را فراهم می‌کنند
  • تست — XCTest از تست‌های واحد، UI و عملکرد روی شبیه‌ساز بدون گواهی توسعه‌دهنده پشتیبانی می‌کند
  • پیکربندی CI — شبیه‌سازها را از طریق xcrun simctl ایجاد کرده و تست‌های موازی روی چندین نسخه iOS اجرا کنید
  • سناریوهای بحرانی — دوربین، بلوتوث، اعلان‌های push و عملکرد Metal نیاز به تست روی دستگاه واقعی دارند
  • Apple Silicon Mac — شبیه‌ساز روی سری M برنامه‌های iOS را با حداقل تفاوت‌های معماری اجرا می‌کند

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید