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 مباشرة من 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 متاحة")
}فهم الاختلافات بين المحاكي والجهاز الحقيقي أمر بالغ الأهمية للاختبار عالي الجودة. تكمن الاختلافات الرئيسية في معمارية المعالج وقدرات الأجهزة وأداء الرسومات.
| الخاصية | المحاكي | الجهاز الحقيقي |
|---|---|---|
| معمارية المعالج | x86_64 / arm64 (Mac) | ARM64 (Apple Silicon) |
| GPU Metal | محاكاة عبر GPU Mac | GPU Apple أصلي |
| الكاميرا | غير متوفرة | كاملة |
| مقياس التسارع/الجيروسكوب | غير متوفرة | أجهزة استشعار |
| Touch ID / Face ID | محاكاة عبر القائمة | قياس حيوي للأجهزة |
| إشعارات الدفع | من Xcode 11.4 (ملف .apns) | خادم APNs |
| Bluetooth LE | غير مدعوم | مكدس كامل |
عادة ما يكون الأداء في المحاكي أعلى من الجهاز الحقيقي، لأنه يستخدم معالج Mac القوي. هذا يخلق انطباعًا زائفًا بالسرعة. قد تعمل الرسوم المتحركة وعمليات Core Data وطلبات الشبكة على الجهاز الحقيقي بشكل أبطأ.
تأكد من تشغيل التطبيق على جهاز حقيقي قبل الإصدار. السيناريوهات الحرجة: الكاميرا و AVFoundation و Bluetooth و CoreBluetooth وإشعارات الدفع عبر APNs وعمليات نظام الملفات في App Sandbox وأداء الرسومات في Metal واستهلاك طاقة البطارية.
للتجميع الشرطي للكود للمحاكي، توفر Apple 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 في ثلاث حالات: استبدال الكاميرا بكائن وهمي أثناء اختبارات واجهة المستخدم، وتعطيل Core Bluetooth لتسريع التطوير، وتسجيل معلومات التصحيح التي يجب ألا تصل إلى إصدار الإنتاج. تجنب استخدام التحقق لتغيير منطق الأعمال — فقد يؤدي ذلك إلى أخطاء على الجهاز الحقيقي.
Xcode Simulator يدعم مجموعة اختبارات XCTest الكاملة: اختبارات الوحدة (XCTestCase) واختبارات واجهة المستخدم (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 الخاص بـ Mac. على الجهاز الحقيقي مع ذاكرة NAND، تكون سرعة القراءة/الكتابة أقل. اختبر أداء Core Data على جهاز قبل الإصدار، خاصةً لمجموعات البيانات الكبيرة.
التحقق من استهلاك الطاقة على المحاكي غير ممكن — المحاكي يعمل من طاقة Mac. تتصرف الأوضاع الخلفية، بما في ذلك تحميل المحتوى وعمليات الجلب، بشكل مختلف على الجهاز الحقيقي بسبب قيود البطارية وجدولة المهام الخلفية.
المحاكي لا يملك access إلى أجهزة استشعار 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 باختبار هذه السيناريوهات فقط على الأجهزة الحقيقية.
على أجهزة Mac بمعالجات السلسلة M، يعمل المحاكي بشكل مختلف جوهريًا: يتم تجميع الكود إلى ARM64 أصلي، كما هو الحال في iPhone حقيقي، بدلاً من x86_64. هذا يقلص الفجوة بين المحاكي والجهاز بشكل كبير. التطبيقات التي تعمل على محاكي Apple Silicon تستخدم نفس تعليمات ARM كما في iPhone الفعلي، مما يجعل اختبارات الأداء أكثر تمثيلاً. الفرق في أداء Metal و Core Animation بين محاكي السلسلة M و iPhone حقيقي ضئيل مقارنة بمحاكي Intel.
إعداد محاكي لـ CI يتطلب إنشاء الجهاز المطلوب وإصدار iOS مسبقًا. على خوادم التكامل المستمر، لا يتم إنشاء المحاكيات تلقائيًا — يجب إضافتها عبر 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 مرات. تأكد من تثبيت جميع محاكيات iOS اللازمة للاختبار على خادم CI.
الأسئلة الشائعة
المحاكي يعمل على معمارية x86_64 ويستخدم معالج Mac، بينما الجهاز الحقيقي يعمل على ARM64 Apple Silicon. المحاكي لا يحاكي الكاميرا وأجهزة الاستشعار و GPU Metal و Bluetooth LE والبطارية. يتم تجميع الكود لمعمارية المضيف، لذا فإن اختبارات الأداء على المحاكي غير تمثيلية.
استخدم #if targetEnvironment(simulator) في Swift أو #if TARGET_OS_SIMULATOR في Objective-C. هذه توجيهات تجميع شرطي: الكود في الكتلة يتم تنفيذه فقط على المحاكي. مفيد لكائنات الكاميرا الوهمية وسجلات التصحيح غير المتوفرة على الجهاز الحقيقي.
نعم، بدءًا من Xcode 11.4، المحاكي يدعم محاكاة إشعارات الدفع عبر ملف .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. سوف نقدم لك النصح ونقترح أفضل حل.