Câu trả lời nhanh chóng
Kể từ Swift 2.0, bạn có thể sử dụng #available
trong if
hoặc guard
để bảo vệ mã chỉ nên chạy trên một số hệ thống nhất định.
if #available(iOS 9, *) {}
Trong Objective-C, bạn cần kiểm tra phiên bản hệ thống và thực hiện so sánh.
[[NSProcessInfo processInfo] operatingSystemVersion]
trong iOS 8 trở lên.
Kể từ Xcode 9:
if (@available(iOS 9, *)) {}
Câu trả lời đầy đủ
Trong Objective-C và Swift trong những trường hợp hiếm hoi, tốt hơn hết là tránh dựa vào phiên bản hệ điều hành như một dấu hiệu cho thấy khả năng của thiết bị hoặc hệ điều hành. Thường có một phương pháp đáng tin cậy hơn để kiểm tra xem một tính năng hoặc lớp cụ thể có sẵn hay không.
Kiểm tra sự hiện diện của API:
Ví dụ: bạn có thể kiểm tra xem UIPopoverController
có khả dụng trên thiết bị hiện tại hay không bằng cách sử dụng NSClassFromString
:
if (NSClassFromString(@"UIPopoverController")) {
// Do something
}
Đối với các lớp được liên kết yếu, việc gửi tin nhắn trực tiếp đến lớp là an toàn. Đáng chú ý, điều này hoạt động cho các khung không được liên kết rõ ràng là "Bắt buộc". Đối với các lớp bị thiếu, biểu thức ước tính đến 0, không đạt điều kiện:
if ([LAContext class]) {
// Do something
}
Một số lớp, như CLLocationManager
và UIDevice
, cung cấp các phương thức để kiểm tra khả năng của thiết bị:
if ([CLLocationManager headingAvailable]) {
// Do something
}
Kiểm tra sự hiện diện của các biểu tượng:
Rất hiếm khi, bạn phải kiểm tra sự hiện diện của hằng số. Điều này xuất hiện trong iOS 8 với việc giới thiệu UIApplicationOpenSettingsURLString
, được sử dụng để tải ứng dụng Cài đặt qua -openURL:
. Giá trị không tồn tại trước iOS 8. Việc chuyển số không vào API này sẽ bị sập, do đó bạn phải cẩn thận để xác minh sự tồn tại của hằng số trước tiên:
if (&UIApplicationOpenSettingsURLString != NULL) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
}
So sánh với phiên bản hệ điều hành:
Giả sử bạn phải đối mặt với nhu cầu tương đối hiếm để kiểm tra phiên bản hệ điều hành. Đối với các dự án nhắm mục tiêu iOS 8 trở lên, NSProcessInfo
bao gồm một phương pháp để thực hiện so sánh phiên bản với ít khả năng xảy ra lỗi hơn:
- (BOOL)isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion)version
Các dự án nhắm mục tiêu hệ thống cũ có thể sử dụng systemVersion
trên UIDevice
. Apple sử dụng nó trong mã mẫu GLSprite của họ .
// A system version of 3.1 or greater is required to use CADisplayLink. The NSTimer
// class is used as fallback when it isn't available.
NSString *reqSysVer = @"3.1";
NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending) {
displayLinkSupported = TRUE;
}
Nếu vì bất kỳ lý do gì bạn quyết định đó systemVersion
là những gì bạn muốn, hãy đảm bảo coi nó là một chuỗi hoặc bạn có nguy cơ cắt bớt số sửa đổi bản vá (ví dụ: 3.1.2 -> 3.1).