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 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.
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.
// 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")
}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ính | Trình mô phỏng | Thiết bị thật |
|---|---|---|
| Kiến trúc CPU | x86_64 / arm64 (Mac) | ARM64 (Apple Silicon) |
| GPU Metal | Mô phỏng qua GPU Mac | GPU Apple gốc |
| Camera | Không khả dụng | Đầy đủ |
| Cảm biến gia tốc/Con quay hồi chuyển | Không khả dụng | Cảm biến phần cứng |
| Touch ID / Face ID | Mô phỏng qua menu | Sinh trắc học phần cứng |
| Thông báo đẩy | Từ Xcode 11.4 (tệp .apns) | Máy chủ APNs |
| Bluetooth LE | Khô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.
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.
Để 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.
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.
#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;
#endifViệ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.
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.
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.
# 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"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.
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 ID và Touch 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ê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.
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ử.
# 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
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.
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ó, 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.
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.
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
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.
Đọc thêm