Jawaban cepat ...
Pada Swift 2.0, Anda dapat menggunakan #available
dalam if
atau guard
untuk melindungi kode yang seharusnya hanya dijalankan pada sistem tertentu.
if #available(iOS 9, *) {}
Di Objective-C, Anda perlu memeriksa versi sistem dan melakukan perbandingan.
[[NSProcessInfo processInfo] operatingSystemVersion]
di iOS 8 dan di atas.
Pada Xcode 9:
if (@available(iOS 9, *)) {}
Jawaban lengkapnya ...
Dalam Objective-C, dan Swift dalam kasus yang jarang terjadi, lebih baik untuk menghindari mengandalkan versi sistem operasi sebagai indikasi kemampuan perangkat atau OS. Biasanya ada metode yang lebih dapat diandalkan untuk memeriksa apakah fitur atau kelas tertentu tersedia.
Memeriksa keberadaan API:
Misalnya, Anda dapat memeriksa apakah UIPopoverController
tersedia di perangkat saat ini menggunakan NSClassFromString
:
if (NSClassFromString(@"UIPopoverController")) {
// Do something
}
Untuk kelas yang memiliki tautan lemah, aman untuk mengirim pesan ke kelas secara langsung. Khususnya, ini berfungsi untuk kerangka kerja yang tidak secara eksplisit ditautkan sebagai "Diperlukan". Untuk kelas yang hilang, ekspresi bernilai nol, gagal kondisinya:
if ([LAContext class]) {
// Do something
}
Beberapa kelas, seperti CLLocationManager
dan UIDevice
, menyediakan metode untuk memeriksa kemampuan perangkat:
if ([CLLocationManager headingAvailable]) {
// Do something
}
Memeriksa keberadaan simbol:
Sangat jarang, Anda harus memeriksa keberadaan konstanta. Ini muncul di iOS 8 dengan pengenalan UIApplicationOpenSettingsURLString
, digunakan untuk memuat aplikasi Pengaturan via -openURL:
. Nilai tidak ada sebelum iOS 8. Melewati nol ke API ini akan macet, jadi Anda harus berhati-hati untuk memverifikasi keberadaan konstanta terlebih dahulu:
if (&UIApplicationOpenSettingsURLString != NULL) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
}
Membandingkan dengan versi sistem operasi:
Mari kita asumsikan Anda dihadapkan dengan kebutuhan yang relatif jarang untuk memeriksa versi sistem operasi. Untuk proyek yang menargetkan iOS 8 dan di atasnya, NSProcessInfo
sertakan metode untuk melakukan perbandingan versi dengan lebih sedikit kemungkinan kesalahan:
- (BOOL)isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion)version
Proyek menargetkan sistem yang lebih tua dapat menggunakan systemVersion
pada UIDevice
. Apple menggunakannya dalam kode sampel GLSprite mereka .
// 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;
}
Jika karena alasan apa pun Anda memutuskan itulah systemVersion
yang Anda inginkan, pastikan untuk memperlakukannya sebagai string atau Anda berisiko memotong nomor revisi tambalan (mis. 3.1.2 -> 3.1).