Pertanyaan Bagaimana cara memeriksa versi iOS?


Saya ingin memeriksa apakah iOS versi perangkat lebih besar dari 3.1.3 Saya mencoba hal-hal seperti:

[[UIDevice currentDevice].systemVersion floatValue]

tetapi tidak berhasil, saya hanya ingin:

if (version > 3.1.3) { }

Bagaimana saya bisa mencapai ini?


772
2017-07-26 23:30


asal


Jawaban:


Jawaban cepat ...


Mulai dari Swift 2.0, Anda bisa menggunakannya #available dalam sebuah 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 atasnya.

Mulai 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 perangkat atau kemampuan 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 terhubung lemah, aman untuk mengirim pesan ke kelas, secara langsung. Khususnya, ini berfungsi untuk kerangka kerja yang tidak secara eksplisit dikaitkan sebagai "Wajib". Untuk kelas yang hilang, ekspresi mengevaluasi ke nol, gagal kondisi:

if ([LAContext class]) {
    // Do something
}

Beberapa kelas, suka CLLocationManager dan UIDevice, berikan metode untuk memeriksa kemampuan perangkat:

if ([CLLocationManager headingAvailable]) {
    // Do something
}

Memeriksa keberadaan simbol:

Terkadang, Anda harus memeriksa keberadaan konstanta. Ini muncul di iOS 8 dengan pengenalan UIApplicationOpenSettingsURLString, digunakan untuk memuat aplikasi Pengaturan melalui -openURL:. Nilai tidak ada sebelum iOS 8. Lewat nil 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 versi sistem operasi:

Anggaplah Anda dihadapkan pada kebutuhan yang relatif jarang untuk memeriksa versi sistem operasi. Untuk proyek yang menargetkan iOS 8 dan di atasnya, NSProcessInfo termasuk metode untuk melakukan perbandingan versi dengan sedikit kemungkinan kesalahan:

- (BOOL)isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion)version

Proyek yang menargetkan sistem lama dapat digunakan systemVersion di UIDevice. Apple menggunakannya di mereka GLSprite Kode sampel.

// 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 itu systemVersion adalah apa yang Anda inginkan, pastikan untuk memperlakukannya sebagai string atau Anda berisiko memotong nomor revisi tambalan (mis. 3.1.2 -> 3.1).


906
2017-07-26 23:44



/*
 *  System Versioning Preprocessor Macros
 */ 

#define SYSTEM_VERSION_EQUAL_TO(v)                  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)
#define SYSTEM_VERSION_GREATER_THAN(v)              ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN(v)                 ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v)     ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)

/*
 *  Usage
 */ 

if (SYSTEM_VERSION_LESS_THAN(@"4.0")) {
    ...
}

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"3.1.1")) {
    ...
}

1039
2017-08-06 09:39



Seperti yang disarankan oleh dokumen Apple resmi: Anda dapat menggunakan NSFoundationVersionNumber, dari NSObjCRuntime.h file header.

if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
    // here you go with iOS 7
}

245
2018-06-08 07:33



Mulai Xcode 9, di Objective-C:

if (@available(iOS 11, *)) {
    // iOS 11 (or newer) ObjC code
} else {
    // iOS 10 or older code
}

Mulai Xcode 7, di Cepat:

if #available(iOS 11, *) {
    // iOS 11 (or newer) Swift code
} else {
    // iOS 10 or older code
}

Untuk versi, Anda dapat menentukan MAJOR, MINOR, atau PATCH (lihat http://semver.org/ untuk definisi). Contoh:

  • iOS 11 dan iOS 11.0 adalah versi minimal yang sama
  • iOS 10, iOS 10.3, iOS 10.3.1 adalah versi minimal yang berbeda

Anda dapat memasukkan nilai untuk salah satu sistem tersebut:

  • iOS, macOS, watchOS, tvOS

Contoh kasus nyata diambil dari salah satu pod saya:

if #available(iOS 10.0, tvOS 10.0, *) {
    // iOS 10+ and tvOS 10+ Swift code
} else {
    // iOS 9 and tvOS 9 older code
}

dokumentasi


63
2017-07-26 23:33



Mencoba:

NSComparisonResult order = [[UIDevice currentDevice].systemVersion compare: @"3.1.3" options: NSNumericSearch];
if (order == NSOrderedSame || order == NSOrderedDescending) {
    // OS version >= 3.1.3
} else {
    // OS version < 3.1.3
}

36
2017-10-07 11:33



Pendekatan Pilihan

Di Swift 2.0 Apple menambahkan pemeriksaan ketersediaan menggunakan sintaks yang jauh lebih nyaman (Baca lebih lanjut sini). Sekarang Anda dapat memeriksa versi OS dengan sintaks yang lebih bersih:

if #available(iOS 9, *) {
    // Then we are on iOS 9
} else {
    // iOS 8 or earlier
}

Ini lebih disukai daripada pemeriksaan respondsToSelector dll (Apa yang Baru Di Swift). Sekarang kompilator akan selalu memperingatkan Anda jika Anda tidak menjaga kode Anda dengan benar.


Pra Swift 2.0

Baru di iOS 8 adalah NSProcessInfo memungkinkan untuk pemeriksaan versi semantik yang lebih baik.

Menyebarkan pada iOS 8 dan lebih besar

Untuk target penerapan minimum iOS 8.0 atau di atas, gunakan NSProcessInfo operatingSystemVersion atau isOperatingSystemAtLeastVersion.

Ini akan menghasilkan hal-hal berikut:

let minimumVersion = NSOperatingSystemVersion(majorVersion: 8, minorVersion: 1, patchVersion: 2)
if NSProcessInfo().isOperatingSystemAtLeastVersion(minimumVersion) {
    //current version is >= (8.1.2)
} else {
    //current version is < (8.1.2)
}

Menerapkan di iOS 7

Untuk target penerapan minimum iOS 7.1 atau di bawah, gunakan bandingkan dengan    NSStringCompareOptions.NumericSearch di UIDevice systemVersion.

Ini akan menghasilkan:

let minimumVersionString = "3.1.3"
let versionComparison = UIDevice.currentDevice().systemVersion.compare(minimumVersionString, options: .NumericSearch)
switch versionComparison {
    case .OrderedSame, .OrderedDescending:
        //current version is >= (3.1.3)
        break
    case .OrderedAscending:
        //current version is < (3.1.3)
        fallthrough
    default:
        break;
}

Lebih banyak membaca di NSHipster.


34
2017-09-18 21:58



Ini digunakan untuk memeriksa versi SDK yang kompatibel di Xcode, ini jika Anda memiliki tim besar dengan berbagai versi Xcode atau beberapa proyek yang mendukung SDK berbeda yang berbagi kode yang sama:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
  //programming in iOS 8+ SDK here
#else
  //programming in lower than iOS 8 here   
#endif

Yang Anda inginkan adalah memeriksa versi iOS di perangkat. Anda dapat melakukannya dengan ini:

if ([[[UIDevice currentDevice] systemVersion] floatValue] < 8.0) {
  //older than iOS 8 code here
} else {
  //iOS 8 specific code here
}

Versi Swift:

if let version = Float(UIDevice.current.systemVersion), version < 9.3 {
    //add lower than 9.3 code here
} else {
    //add 9.3 and above code here
}

34
2017-07-27 06:32



Saya merekomendasi:

if ([[[UIDevice currentDevice] systemVersion] floatValue] > 3.13) {
    ; // ...
}

kredit: Bagaimana cara menargetkan versi iPhone tertentu?


19
2018-03-15 10:10



Saya selalu menyimpannya di file Constants.h saya:

#define IS_IPHONE5 (([[UIScreen mainScreen] bounds].size.height-568)?NO:YES) 
#define IS_OS_5_OR_LATER    ([[[UIDevice currentDevice] systemVersion] floatValue] >= 5.0)
#define IS_OS_6_OR_LATER    ([[[UIDevice currentDevice] systemVersion] floatValue] >= 6.0)
#define IS_OS_7_OR_LATER    ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
#define IS_OS_8_OR_LATER    ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)

8
2017-11-20 12:26



+(BOOL)doesSystemVersionMeetRequirement:(NSString *)minRequirement{

// eg  NSString *reqSysVer = @"4.0";


  NSString *currSysVer = [[UIDevice currentDevice] systemVersion];

  if ([currSysVer compare:minRequirement options:NSNumericSearch] != NSOrderedAscending)
  {
    return YES;
  }else{
    return NO;
  }


}

6
2018-04-03 10:30



Dengan Versi kelas yang terkandung dalam nv-ios-versi proyek (Lisensi Apache, Versi 2.0), mudah untuk mendapatkan dan membandingkan versi iOS. Kode contoh di bawah membuang versi iOS dan memeriksa apakah versinya lebih besar atau sama dengan 6.0.

// Get the system version of iOS at runtime.
NSString *versionString = [[UIDevice currentDevice] systemVersion];

// Convert the version string to a Version instance.
Version *version = [Version versionWithString:versionString];

// Dump the major, minor and micro version numbers.
NSLog(@"version = [%d, %d, %d]",
    version.major, version.minor, version.micro);

// Check whether the version is greater than or equal to 6.0.
if ([version isGreaterThanOrEqualToMajor:6 minor:0])
{
    // The iOS version is greater than or equal to 6.0.
}

// Another way to check whether iOS version is
// greater than or equal to 6.0.
if (6 <= version.major)
{
    // The iOS version is greater than or equal to 6.0.
}

Halaman Proyek: nv-ios-versi
Takahiko Kawasaki / nv-ios-versi

Blog: Dapatkan dan bandingkan versi iOS saat runtime dengan kelas Versi
Dapatkan dan bandingkan versi iOS saat runtime dengan kelas Versi


6
2018-06-11 09:02