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 API พร้อมใช้งาน")
}การทำความเข้าใจความแตกต่างระหว่างซิมิวเลเตอร์กับอุปกรณ์จริงมีความสำคัญอย่างยิ่งต่อการทดสอบที่มีคุณภาพ ความแตกต่างหลักอยู่ที่สถาปัตยกรรมโปรเซสเซอร์ ความสามารถด้านฮาร์ดแวร์ และประสิทธิภาพกราฟิก
| คุณลักษณะ | ซิมิวเลเตอร์ | อุปกรณ์จริง |
|---|---|---|
| สถาปัตยกรรม CPU | 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 ใช้ในสามกรณี: การแทนที่กล้องด้วยออบเจกต์จำลองระหว่างการทดสอบ 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 ของ Mac บนอุปกรณ์จริงที่มีหน่วยความจำ NAND ความเร็วในการอ่าน/เขียนจะต่ำกว่า ทดสอบประสิทธิภาพ Core Data บนอุปกรณ์ก่อนเผยแพร่ โดยเฉพาะอย่างยิ่งสำหรับชุดข้อมูลขนาดใหญ่
การตรวจสอบการใช้พลังงานบนซิมิวเลเตอร์เป็นไปไม่ได้ — ซิมิวเลวเตอร์ใช้พลังงานจาก Mac โหมดพื้นหลัง รวมถึงการโหลดเนื้อหาและการดำเนินการดึงข้อมูล จะทำงานแตกต่างกันบนอุปกรณ์จริงเนื่องจากข้อจำกัดของแบตเตอรี่และ 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 แนะนำให้ทดสอบสถานการณ์เหล่านี้บนอุปกรณ์จริงเท่านั้น
บน Mac ที่มีโปรเซสเซอร์ M-series ซิมิวเลเตอร์ทำงานแตกต่างกันโดยพื้นฐาน: โค้ดถูกคอมไพล์เป็น ARM64 ดั้งเดิม เช่นเดียวกับบน iPhone จริง แทนที่จะเป็น x86_64 ซึ่งช่วยลดช่องว่างระหว่างซิมิวเลเตอร์และอุปกรณ์ได้อย่างมาก แอปพลิเคชันที่ทำงานบนซิมิวเลเตอร์ Apple Silicon ใช้คำสั่ง ARM เดียวกันกับบน iPhone จริง ทำให้การทดสอบประสิทธิภาพมีความเป็นตัวแทนมากขึ้น ความแตกต่างของประสิทธิภาพ Metal และ Core Animation ระหว่างซิมิวเลเตอร์ M-series กับ 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 เท่า ตรวจสอบให้แน่ใจว่าได้ติดตั้งซิมิวเลเตอร์ iOS ที่จำเป็นทั้งหมดสำหรับการทดสอบบนเซิร์ฟเวอร์ CI
คำถามที่พบบ่อย
ซิมิวเลเตอร์ทำงานบนสถาปัตยกรรม x86_64 และใช้ CPU ของ 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 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ