iOS Simulator: คืออะไรและทำงานอย่างไรใน Xcode

ผู้แต่ง: IT Sectr เผยแพร่เมื่อ: 2026-02-09 เวลาอ่าน: 8 นาที

Xcode Simulator เป็นเครื่องมือในตัวของ Apple ที่เรียกใช้แอปพลิเคชัน iOS บน Mac โดยไม่ต้องใช้อุปกรณ์จริง ซิมิวเลเตอร์จะคอมไพล์โค้ดสำหรับสถาปัตยกรรม x86_64 ของโฮสต์ ซึ่งให้ความเร็วในการทดสอบสูง เอกสารของ Apple อธิบายวงจรการดีบักที่สมบูรณ์โดยใช้ซิมิวเลเตอร์สำหรับ iPhone, iPad, Apple Watch และ Apple TV

ประเด็นสำคัญ

  • Xcode Simulator — การจำลองอุปกรณ์ iOS ในระดับแอปพลิเคชันโดยไม่ต้องจำลองสถาปัตยกรรม ARM เต็มรูปแบบ
  • ความแตกต่างจากอุปกรณ์จริง — ซิมิวเลเตอร์ไม่รองรับกล้อง, GPU Metal, เซ็นเซอร์ และการแจ้งเตือนแบบพุช (ก่อน 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 บน 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

swift
// การตรวจสอบเวอร์ชัน iOS ขั้นต่ำสำหรับซิมิวเลเตอร์
if #available(iOS 18.0, *) {
    print("iOS 18 API พร้อมใช้งาน")
}

ความแตกต่างระหว่างซิมิวเลเตอร์กับอุปกรณ์จริง

การทำความเข้าใจความแตกต่างระหว่างซิมิวเลเตอร์กับอุปกรณ์จริงมีความสำคัญอย่างยิ่งต่อการทดสอบที่มีคุณภาพ ความแตกต่างหลักอยู่ที่สถาปัตยกรรมโปรเซสเซอร์ ความสามารถด้านฮาร์ดแวร์ และประสิทธิภาพกราฟิก

คุณลักษณะซิมิวเลเตอร์อุปกรณ์จริง
สถาปัตยกรรม CPUx86_64 / arm64 (Mac)ARM64 (Apple Silicon)
GPU Metalจำลองผ่าน GPU ของ MacGPU Apple ดั้งเดิม
กล้องไม่พร้อมใช้งานเต็มรูปแบบ
มาตรความเร่ง/ไจโรสโคปไม่พร้อมใช้งานเซ็นเซอร์ฮาร์ดแวร์
Touch ID / Face IDจำลองผ่านเมนูไบโอเมตริกซ์ฮาร์ดแวร์
การแจ้งเตือนแบบพุชตั้งแต่ Xcode 11.4 (ไฟล์ .apns)เซิร์ฟเวอร์ APNs
Bluetooth LEไม่รองรับสแต็กเต็มรูปแบบ

ประสิทธิภาพในซิมิวเลเตอร์มักจะสูงกว่าอุปกรณ์จริง เนื่องจากใช้โปรเซสเซอร์ที่ทรงพลังของ Mac ซึ่งสร้างความประทับใจที่ผิดเกี่ยวกับความเร็ว แอนิเมชัน การดำเนินการ Core Data และคำขอเครือข่ายบนอุปกรณ์จริงอาจทำงานช้ากว่า

เมื่อใดที่ต้องทดสอบบนอุปกรณ์จริง

อย่าลืมเรียกใช้แอปพลิเคชันบนอุปกรณ์จริงก่อนเผยแพร่ สถานการณ์ที่สำคัญ: กล้องและ AVFoundation, Bluetooth และ CoreBluetooth, การแจ้งเตือนแบบพุชผ่าน APNs, การดำเนินการระบบไฟล์ใน App Sandbox, ประสิทธิภาพกราฟิกใน Metal และการใช้พลังงานแบตเตอรี่

การตรวจสอบ TARGET_OS_SIMULATOR ในโค้ด

สำหรับการคอมไพล์โค้ดแบบมีเงื่อนไขสำหรับซิมิวเลเตอร์ Apple มี 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 ของ 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 แนะนำให้ทดสอบสถานการณ์เหล่านี้บนอุปกรณ์จริงเท่านั้น

ซิมิวเลเตอร์บน Apple Silicon Mac

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

คำถามที่พบบ่อย

Xcode Simulator แตกต่างจากอุปกรณ์จริงอย่างไร?

ซิมิวเลเตอร์ทำงานบนสถาปัตยกรรม 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 การแจ้งเตือนจะแสดงอย่างสมบูรณ์เหมือนบนอุปกรณ์จริง

ข้อจำกัดของ Xcode Simulator คืออะไร?

ซิมิวเลเตอร์ไม่รองรับกล้อง ไมโครโฟน มาตรความเร่ง ไจโรสโคป TrueDepth Touch ID (ยกเว้นการจำลอง) Face ID (ยกเว้นการจำลอง) Bluetooth LE และ NFC ประสิทธิภาพ Metal ถูกจำลองบน GPU ของ Mac ซึ่งไม่สะท้อนประสิทธิภาพจริงของ iPhone ไม่สามารถวัดการใช้พลังงานได้

วิธีเรียกใช้การทดสอบบน CI โดยใช้ซิมิวเลเตอร์?

สร้างซิมิวเลเตอร์ผ่าน xcrun simctl create จากนั้นเรียกใช้ xcodebuild test ด้วยพารามิเตอร์ -destination ที่ระบุ platform=iOS Simulator และชื่ออุปกรณ์ สำหรับการทดสอบแบบขนาน ให้สร้างซิมิวเลเตอร์หลายตัวด้วยเวอร์ชัน iOS ที่แตกต่างกันในการกำหนดค่า CI

สรุป

  • Xcode Simulator — เครื่องมือเรียกใช้แอปพลิเคชัน iOS บน Mac คอมไพล์โค้ดสำหรับสถาปัตยกรรมโฮสต์โดยไม่มีการจำลอง ARM
  • ความแตกต่างจากอุปกรณ์ — ซิมิวเลเตอร์ไม่รองรับกล้อง GPU Metal เซ็นเซอร์ Bluetooth NFC และไม่ได้ให้ประสิทธิภาพที่เป็นตัวแทน
  • การคอมไพล์แบบมีเงื่อนไข — TARGET_OS_SIMULATOR และ targetEnvironment(simulator) ช่วยให้เพิ่มออบเจกต์จำลองและบันทึกการดีบัก
  • การทดสอบ — XCTest รองรับการทดสอบหน่วย UI และประสิทธิภาพบนซิมิวเลเตอร์โดยไม่ต้องใช้ใบรับรองนักพัฒนา
  • การตั้งค่า CI — สร้างซิมิวเลเตอร์ผ่าน xcrun simctl และเรียกใช้การทดสอบแบบขนานบนหลายเวอร์ชัน iOS
  • สถานการณ์สำคัญ — กล้อง Bluetooth การแจ้งเตือนแบบพุช และประสิทธิภาพ Metal ต้องทดสอบบนอุปกรณ์จริง
  • Apple Silicon Mac — ซิมิวเลเตอร์บน M-series เรียกใช้แอปพลิเคชัน iOS โดยมีความแตกต่างทางสถาปัตยกรรมน้อยที่สุด

เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร

IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ

ปรึกษาโครงการ

อ่านเพิ่มเติม