Khi phát triển ứng dụng iOS, đôi khi chúng ta cần biết thiết bị nào đang chạy ứng dụng để cung cấp các tính năng tùy chỉnh cho từng loại thiết bị. Ví dụ, bạn muốn cung cấp một số tính năng trên iPhone X nhưng không trên iPhone 7. Trong bài viết này, chúng ta sẽ học cách xác định thiết bị iOS đang được sử dụng thông qua một ứng dụng iOS.
Các khái niệm cần thiết
Để đạt được kết quả mong muốn, chúng ta cần hiểu một số thuật ngữ sau:
- utsname – là một cấu trúc nằm trong module Darwin của iOS.
- uname – là một hàm nhận utsname làm đầu vào và trả về Int32.
- Mirror – là biểu diễn của cấu trúc con và kiểu hiển thị của một thể hiện bất kỳ.
Việc tìm thiết bị đang sử dụng trên iOS SDK là một nhiệm vụ đơn giản nếu chúng ta chỉ cần tìm tên hoặc mô hình thiết bị. Chúng ta có thể sử dụng một trong các đoạn mã dưới đây để nhận được một chuỗi kết quả. Tuy nhiên, mã trên không cho biết chính xác thiết bị nào đang được sử dụng, nó chỉ cho biết rằng đang dùng iPhone. Để lấy chính xác tên thiết bị, chúng ta cần thực hiện một số bước bổ sung.
Lấy mã định danh thiết bị bằng Swift
Trong Swift, chúng ta sẽ sử dụng tất cả các thuật ngữ trên để lấy mã thiết bị (identifier) làm đầu ra.
func getDevice() -> String {
var systemInfo = utsname()
uname(&systemInfo)
let machineMirror = Mirror(reflecting: systemInfo.machine)
let identifier = machineMirror.children.reduce("") { identifier, element in
guard let value = element.value as? Int8, value != 0 else { return identifier }
return identifier + String(UnicodeScalar(UInt8(value)))
}
return identifier
}
Hàm này trả về mã mô hình (model code) chứ không phải tên thiết bị chính xác. Chúng ta phải so sánh biến identifier này với nhiều giá trị khác nhau để lấy tên mô hình theo yêu cầu.
Dưới đây là ví dụ kết quả khi chạy mã trên trình mô phỏng (simulator) iPhone 7 Plus chạy iOS 12.0:

Bảng tra cứu mã mô hình thiết bị Apple
Một số mã mô hình phổ biến của thiết bị Apple và tên tương ứng:
| Mã mô hình | Tên thiết bị |
|---|---|
| iPod4,1 | iPod Touch 4G |
| iPod5,1 | iPod Touch 5G |
| iPod7,1 | iPod Touch 6G |
| iPhone3,1, iPhone3,2, iPhone3,3 | iPhone 4 |
| iPhone4,1 | iPhone 4s |
| iPhone5,1, iPhone5,2 | iPhone 5 |
| iPhone5,3, iPhone5,4 | iPhone 5c |
| iPhone6,1, iPhone6,2 | iPhone 5s |
| iPhone7,2 | iPhone 6 |
| iPhone7,1 | iPhone 6 Plus |
| iPhone8,1 | iPhone 6s |
| iPhone8,2 | iPhone 6s Plus |
| iPhone8,4 | iPhone SE |
| iPhone9,1, iPhone9,3 | iPhone 7 |
| iPhone9,2, iPhone9,4 | iPhone 7 Plus |
| iPad2,1, iPad2,2, iPad2,3, iPad2,4 | iPad 2 |
| iPad3,1, iPad3,2, iPad3,3 | iPad 3 |
| iPad3,4, iPad3,5, iPad3,6 | iPad 4 |
| iPad4,1, iPad4,2, iPad4,3 | iPad Air |
| iPad5,3, iPad5,4 | iPad Air 2 |
| iPad2,5, iPad2,6, iPad2,7 | iPad Mini |
| iPad4,4, iPad4,5, iPad4,6 | iPad Mini 2 |
| iPad4,7, iPad4,8, iPad4,9 | iPad Mini 3 |
| iPad5,1, iPad5,2 | iPad Mini 4 |
| iPad6,3, iPad6,4 | iPad Pro (9.7 inch) |
| iPad6,7, iPad6,8 | iPad Pro (12.9 inch) |
Lưu ý: Danh sách trên không đầy đủ cho các thiết bị mới hơn (iPhone 8, X, 11, 12, 13, 14, 15, iPad Pro M1/M2, v.v.). Bạn nên cập nhật danh sách này từ tài liệu chính thức của Apple hoặc sử dụng thư viện như DeviceKit để hỗ trợ tự động.