iOS Simulator: nó là gì và cách hoạt động trong Xcode

Tác giả: IT Sectr Đã đăng: 2026-02-09 Thời gian đọc: 8 phút

Xcode Simulator là công cụ tích hợp của Apple cho phép chạy ứng dụng iOS trên Mac mà không cần thiết bị vật lý. Trình mô phỏng biên dịch mã cho kiến trúc x86_64 của máy chủ, đảm bảo tốc độ kiểm thử cao. Tài liệu Apple mô tả chu trình gỡ lỗi đầy đủ bằng trình mô phỏng cho iPhone, iPad, Apple Watch và Apple TV.

Những điểm chính

  • Xcode Simulator — mô phỏng thiết bị iOS ở cấp ứng dụng mà không cần mô phỏng đầy đủ kiến trúc ARM
  • Khác biệt với thiết bị thật — trình mô phỏng không hỗ trợ camera, GPU Metal, cảm biến và thông báo đẩy (trước Xcode 11.4)
  • TARGET_OS_SIMULATOR — chỉ thị để kiểm tra môi trường thực thi trong mã Objective-C và Swift
  • Kiểm thử đơn vị và kiểm thử giao diện — trình mô phỏng hỗ trợ đầy đủ bộ XCTest với khả năng chạy trên máy chủ CI
  • Nhiều nền tảng — trình mô phỏng hỗ trợ iPhone, iPad, Apple Watch, Apple TV và Vision Pro

Simulator trong Xcode là gì?

Xcode Simulator là công cụ chạy và gỡ lỗi ứng dụng iOS trực tiếp trên Mac. Không giống như trình giả lập Android, trình mô phỏng của Apple không giả lập bộ xử lý ARM của thiết bị. Thay vào đó, mã được biên dịch thành mã máy của kiến trúc máy chủ (x86_64 trên Intel Mac hoặc arm64 trên Apple Silicon).

Trình mô phỏng sử dụng các framework iOS trực tiếp từ SDK, cung cấp quyền truy cập vào UIKit, SwiftUI, Foundation và Core Data. Theo Apple (WWDC 2024), hơn 90% nhà phát triển sử dụng trình mô phỏng trong giai đoạn phát triển, chỉ kết nối thiết bị vật lý cho kiểm thử cuối cùng.

Mỗi phiên bản Xcode bao gồm một bộ trình mô phỏng cho các mẫu thiết bị và phiên bản iOS khác nhau. Ví dụ: Xcode 16 chứa trình mô phỏng cho iPhone 16 Pro với iOS 18, iPad Pro M4 với iPadOS 18, Apple Watch Series 10 và Apple TV 4K.

Cài đặt và khởi chạy trình mô phỏng

Trình mô phỏng được cài đặt cùng với Xcode từ Mac App Store. Để thêm các phiên bản iOS bổ sung, sử dụng menu Settings → Platforms. Chọn trình mô phỏng trong lược đồ xây dựng (Scheme) và nhấn Run. Hoặc khởi chạy trình mô phỏng qua menu Xcode → Open Developer Tool → Simulator.

swift
// Kiểm tra phiên bản iOS tối thiểu cho trình mô phỏng
if #available(iOS 18.0, *) {
    print("API iOS 18 khả dụng")
}

Sự khác biệt giữa trình mô phỏng và thiết bị thật

Hiểu được sự khác biệt giữa trình mô phỏng và thiết bị thật là cực kỳ quan trọng để kiểm thử chất lượng. Sự khác biệt chính nằm ở kiến trúc bộ xử lý, khả năng phần cứng và hiệu suất đồ họa.

Đặc tínhTrình mô phỏngThiết bị thật
Kiến trúc CPUx86_64 / arm64 (Mac)ARM64 (Apple Silicon)
GPU MetalMô phỏng qua GPU MacGPU Apple gốc
CameraKhông khả dụngĐầy đủ
Cảm biến gia tốc/Con quay hồi chuyểnKhông khả dụngCảm biến phần cứng
Touch ID / Face IDMô phỏng qua menuSinh trắc học phần cứng
Thông báo đẩyTừ Xcode 11.4 (tệp .apns)Máy chủ APNs
Bluetooth LEKhông được hỗ trợNgăn xếp đầy đủ

Hiệu suất trong trình mô phỏng thường cao hơn thiết bị thật vì nó sử dụng bộ xử lý mạnh mẽ của Mac. Điều này tạo ra ấn tượng sai về tốc độ. Hoạt ảnh, thao tác Core Data và yêu cầu mạng trên thiết bị thật có thể chạy chậm hơn.

Khi nào bắt buộc phải kiểm thử trên thiết bị

Hãy đảm bảo chạy ứng dụng trên thiết bị thật trước khi phát hành. Các kịch bản quan trọng: camera và AVFoundation, Bluetooth và CoreBluetooth, thông báo đẩy qua APNs, thao tác hệ thống tệp trong App Sandbox, hiệu suất đồ họa trong Metal và mức tiêu thụ pin.

Kiểm tra TARGET_OS_SIMULATOR trong mã

Để biên dịch có điều kiện mã cho trình mô phỏng, Apple cung cấp TARGET_OS_SIMULATOR trong Objective-C và targetEnvironment(simulator) trong Swift. Việc kiểm tra này cho phép thêm nhật ký gỡ lỗi, đối tượng giả hoặc vô hiệu hóa mã phụ thuộc phần cứng.

swift
import UIKit

class CameraViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        #if targetEnvironment(simulator)
        showMockCameraPreview()
        print("Trình mô phỏng: sử dụng camera giả")
        #else
        setupRealCameraSession()
        #endif
    }
}

Trong Objective-C, chỉ thị #if TARGET_OS_SIMULATOR hoạt động tương tự. Sử dụng nó để vô hiệu hóa mã yêu cầu cảm biến phần cứng hoặc camera. Tại thời điểm biên dịch cho trình mô phỏng, mã này không được đưa vào tệp nhị phân.

objective-c
#if TARGET_OS_SIMULATOR
NSLog(@"Đang chạy trong trình mô phỏng — camera không khả dụng");
self.cameraButton.hidden = YES;
#else
self.cameraButton.hidden = NO;
#endif

Các trường hợp sử dụng điển hình của việc kiểm tra

Việc kiểm tra TARGET_OS_SIMULATOR được sử dụng trong ba trường hợp: thay thế camera bằng đối tượng giả trong kiểm thử giao diện, vô hiệu hóa Core Bluetooth để tăng tốc phát triển và ghi nhật ký thông tin gỡ lỗi không nên có trong bản phát hành. Tránh sử dụng việc kiểm tra để thay đổi logic kinh doanh — điều này có thể dẫn đến lỗi trên thiết bị thật.

Chạy kiểm thử trong trình mô phỏng

Xcode Simulator hỗ trợ đầy đủ bộ kiểm thử XCTest: kiểm thử đơn vị (XCTestCase), kiểm thử giao diện (XCUITestCase) và kiểm thử hiệu suất. Kiểm thử trên trình mô phỏng không yêu cầu chứng chỉ nhà phát triển đã ký, giúp đơn giản hóa thiết lập 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)
    }
}

Để chạy kiểm thử từ dòng lệnh, sử dụng xcodebuild test với lược đồ và trình mô phỏng được chỉ định. Tham số -destination xác định trình mô phỏng cụ thể mà kiểm thử sẽ được chạy.

bash
# Chạy kiểm thử đơn vị trên trình mô phỏng iPhone 16, iOS 18
xcodebuild test \
  -scheme "MyApp" \
  -destination "platform=iOS Simulator,name=iPhone 16,OS=18.0" \
  -testPlan "AllTests"

Hạn chế và cạm bẫy

Mặc dù tiện lợi, Xcode Simulator có một số hạn chế có thể dẫn đến lỗi trên thiết bị thật. Quan trọng nhất là thiếu mô phỏng ARM: mã được biên dịch cho kiến trúc máy chủ và hành vi của một số thao tác có thể khác biệt.

Core Data và hệ thống tệp hoạt động nhanh hơn trên trình mô phỏng do SSD của Mac. Trên thiết bị thật với bộ nhớ NAND, tốc độ đọc/ghi thấp hơn. Hãy kiểm thử hiệu suất Core Data trên thiết bị trước khi phát hành, đặc biệt là với các tập dữ liệu lớn.

Không thể kiểm tra mức tiêu thụ điện năng trên trình mô phỏng — trình mô phỏng được cấp nguồn từ Mac. Các chế độ nền, bao gồm tải nội dung và thao tác tìm nạp, hoạt động khác trên thiết bị thật do giới hạn pin và Background Task Scheduler.

Cảm biến phần cứng và sinh trắc học

Trình mô phỏng không có quyền truy cập vào cảm biến phần cứng của iPhone. Face IDTouch ID có thể được mô phỏng qua menu trình mô phỏng: Features → Face ID → Matching Face. Cảm biến gia tốc, con quay hồi chuyển và phong vũ biểu không khả dụng — mã phụ thuộc vào CMDeviceMotion cần được kiểm thử trên thiết bị. Đối với Core Location, bạn có thể đặt tọa độ qua Debug → Simulate Location bằng cách chọn tệp GPX.

Việc kiểm tra iCloud và StoreKit trên trình mô phỏng cũng bị hạn chế. StoreKit Test cho phép mô phỏng giao dịch mua mà không cần App Store Connect thật, nhưng việc kiểm tra môi trường Sandbox và giao dịch mua trong sản xuất yêu cầu thiết bị vật lý. Đồng bộ iCloud Drive và CloudKit trên trình mô phỏng hoạt động không chính xác — Apple khuyến nghị chỉ kiểm thử các kịch bản này trên thiết bị thật.

Trình mô phỏng trên Apple Silicon Mac

Trên Mac có bộ xử lý dòng M, trình mô phỏng hoạt động khác về cơ bản: mã được biên dịch thành ARM64 gốc, như trên iPhone thật, thay vì x86_64. Điều này thu hẹp đáng kể khoảng cách giữa trình mô phỏng và thiết bị. Các ứng dụng chạy trên trình mô phỏng Apple Silicon sử dụng cùng lệnh ARM như trên iPhone vật lý, làm cho kiểm thử hiệu suất đại diện hơn. Sự khác biệt về hiệu suất Metal và Core Animation giữa trình mô phỏng dòng M và iPhone thật là tối thiểu so với trình mô phỏng Intel.

Cấu hình trình mô phỏng cho CI

Thiết lập trình mô phỏng cho CI yêu cầu tạo trước thiết bị và phiên bản iOS cần thiết. Trên máy chủ tích hợp liên tục, trình mô phỏng không được tạo tự động — cần được thêm qua xcrun simctl create trước khi chạy kiểm thử.

bash
# Tạo trình mô phỏng cho CI
xcrun simctl create \
  "iPhone 16 CI" \
  "com.apple.CoreSimulator.SimDeviceType.iPhone-16" \
  "com.apple.CoreSimulator.SimRuntime.iOS-18-0"

# Chạy kiểm thử trên trình mô phỏng đã tạo
xcodebuild test \
  -workspace MyApp.xcworkspace \
  -scheme MyApp \
  -destination "id=$(xcrun simctl list devices | grep 'iPhone 16 CI' | awk -F'[][]' '{print }')"

Để kiểm thử song song trên CI, hãy cấu hình nhiều trình mô phỏng với các phiên bản iOS khác nhau. Xcode Cloud, GitHub Actions và Bitrise hỗ trợ thực thi kiểm thử song song, giảm thời gian chạy 2-3 lần. Đảm bảo tất cả các trình mô phỏng iOS cần thiết cho kiểm thử đã được cài đặt trên máy chủ CI.

Câu hỏi thường gặp

Xcode Simulator khác gì so với thiết bị thật?

Trình mô phỏng chạy trên kiến trúc x86_64 và sử dụng CPU Mac, trong khi thiết bị thật chạy trên ARM64 Apple Silicon. Trình mô phỏng không mô phỏng camera, cảm biến, GPU Metal, Bluetooth LE và pin. Mã được biên dịch cho kiến trúc máy chủ, vì vậy kiểm thử hiệu suất trên trình mô phỏng không mang tính đại diện.

Làm thế nào để kiểm tra trong mã xem ứng dụng có đang chạy trên trình mô phỏng không?

Sử dụng #if targetEnvironment(simulator) trong Swift hoặc #if TARGET_OS_SIMULATOR trong Objective-C. Đây là các chỉ thị biên dịch có điều kiện: mã trong khối chỉ thực thi trên trình mô phỏng. Hữu ích cho đối tượng giả camera và nhật ký gỡ lỗi không khả dụng trên thiết bị thật.

Có thể kiểm thử thông báo đẩy trên trình mô phỏng không?

Có, từ Xcode 11.4, trình mô phỏng hỗ trợ mô phỏng thông báo đẩy qua tệp .apns với cấu trúc JSON. Kéo tệp vào trình mô phỏng đang chạy hoặc sử dụng lệnh xcrun simctl push. Thông báo hiển thị đầy đủ như trên thiết bị thật.

Các hạn chế của Xcode Simulator là gì?

Trình mô phỏng không hỗ trợ camera, micrô, cảm biến gia tốc, con quay hồi chuyển, TrueDepth, Touch ID (ngoại trừ mô phỏng), Face ID (ngoại trừ mô phỏng), Bluetooth LE và NFC. Hiệu suất Metal được mô phỏng trên GPU Mac, không phản ánh hiệu suất thực tế của iPhone. Không thể đo mức tiêu thụ điện năng.

Làm thế nào để chạy kiểm thử trên CI bằng trình mô phỏng?

Tạo trình mô phỏng qua xcrun simctl create, sau đó chạy xcodebuild test với tham số -destination chỉ định platform=iOS Simulator và tên thiết bị. Để kiểm thử song song, hãy tạo nhiều trình mô phỏng với các phiên bản iOS khác nhau trong cấu hình CI.

Tổng kết

  • Xcode Simulator — công cụ chạy ứng dụng iOS trên Mac, biên dịch mã cho kiến trúc máy chủ mà không cần mô phỏng ARM
  • Khác biệt với thiết bị — trình mô phỏng không hỗ trợ camera, GPU Metal, cảm biến, Bluetooth, NFC và không cung cấp hiệu suất đại diện
  • Biên dịch có điều kiện — TARGET_OS_SIMULATOR và targetEnvironment(simulator) cho phép thêm đối tượng giả và nhật ký gỡ lỗi
  • Kiểm thử — XCTest hỗ trợ kiểm thử đơn vị, giao diện và hiệu suất trên trình mô phỏng mà không cần chứng chỉ nhà phát triển
  • Thiết lập CI — tạo trình mô phỏng qua xcrun simctl và chạy kiểm thử song song trên nhiều phiên bản iOS
  • Kịch bản quan trọng — camera, Bluetooth, thông báo đẩy và hiệu suất Metal yêu cầu kiểm thử trên thiết bị thật
  • Apple Silicon Mac — trình mô phỏng trên dòng M chạy ứng dụng iOS với khác biệt kiến trúc tối thiểu

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm