Saya ingin memeriksa apakah iOS
versi perangkat lebih besar daripada 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?
ios
objective-c
John
sumber
sumber
if #available(iOS 9, *) {}
di Swift. Mulai Xcode 9,if (@available(iOS 11, *)) {}
secara objektif-c.Jawaban:
Jawaban cepat ...
Pada Swift 2.0, Anda dapat menggunakan
#available
dalamif
atauguard
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 menggunakanNSClassFromString
: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:
Beberapa kelas, seperti
CLLocationManager
danUIDevice
, menyediakan metode untuk memeriksa kemampuan perangkat: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: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:Proyek menargetkan sistem yang lebih tua dapat menggunakan
systemVersion
padaUIDevice
. Apple menggunakannya dalam kode sampel GLSprite mereka .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).sumber
-viewWillAppear
dalamUISplitViewController
. Retas saya adalah untuk menentukan apakah <iOS 4.0, dan mengirimkannya sendiri ke Detail View Controller di Root View's-didSelectRowAtIndexPath
.[@"10.0" compare:@"10" options:NSNumericSearch]
pengembalianNSOrderedDescending
, yang mungkin tidak dimaksudkan sama sekali. (Saya mungkin berharapNSOrderedSame
.) Ini setidaknya kemungkinan teoretis.respondsToSelector
et al tidak akan melakukan pekerjaan - harus membandingkan versi.NSFoundationVersionNumber
dan hanya jika itu tidak mungkin Anda memeriksa versi sistemUIDevice
.sumber
.0
nomor opsional . MisalnyaSYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0.0")
memberikan hasil yang salah pada iOS 7.0.Seperti yang disarankan oleh dokumen resmi Apple : Anda dapat menggunakan
NSFoundationVersionNumber
, dariNSObjCRuntime.h
file header.sumber
NSFoundationVersionNumber_iOS_6_1
tidak ada di iOS 5 SDK.#ifndef NSFoundationVersionNumber_iOS_7_0 #define NSFoundationVersionNumber_iOS_7_0 1047.00 #endif
. Untuk menghindari kekacauan seperti itu, saya menggunakan makro SYSTEM_VERSION_LESS_THAN (v) dari yasirmturkNSFoundationVersionNumber_iOS_8_0
di iOS 9. cukup periksaNSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1
Mulai Xcode 9, di Objective-C :
Mulai Xcode 7, di Swift :
Untuk versi, Anda dapat menentukan MAJOR, MINOR atau PATCH (lihat http://semver.org/ untuk definisi). Contoh:
iOS 11
daniOS 11.0
merupakan versi minimal yang samaiOS 10
,iOS 10.3
,iOS 10.3.1
Adalah versi minimal yang berbedaAnda dapat memasukkan nilai untuk semua sistem tersebut:
iOS
,macOS
,watchOS
,tvOS
Contoh kasus nyata diambil dari salah satu pod saya :
dokumentasi
sumber
if (...) {} else { ... }
guard
di Objective-C bukannya membiarkan blok terbuka dan indentasi dalamelse
pernyataan?if
blok kosong yang diikuti olehelse
.if
blok kosong .Ini digunakan untuk memeriksa versi SDK yang kompatibel di Xcode, ini adalah jika Anda memiliki tim besar dengan versi Xcode yang berbeda atau beberapa proyek yang mendukung SDK berbeda yang memiliki kode yang sama:
Yang benar-benar Anda inginkan adalah memeriksa versi iOS di perangkat. Anda dapat melakukannya dengan ini:
Versi cepat:
Versi swift saat ini harus menggunakan ini:
sumber
Mencoba:
sumber
Pendekatan yang disukai
Di Swift 2.0 Apple menambahkan pemeriksaan ketersediaan menggunakan sintaks yang jauh lebih nyaman (Baca lebih lanjut di sini ). Sekarang Anda dapat memeriksa versi OS dengan sintaks yang lebih bersih:
Ini lebih disukai daripada memeriksa
respondsToSelector
dll ( Apa yang Baru Di Swift ). Sekarang kompiler akan selalu memperingatkan Anda jika Anda tidak menjaga kode Anda dengan benar.Pra Swift 2.0
Baru di iOS 8
NSProcessInfo
memungkinkan untuk pemeriksaan versi semantik yang lebih baik.Menyebarkan di iOS 8 dan lebih tinggi
Ini akan menghasilkan yang berikut:
Menyebarkan di iOS 7
Ini akan menghasilkan:
Lebih banyak membaca di NSHipster .
sumber
Saya selalu menyimpannya di file Constants.h saya:
sumber
.pch
file Proyek XCode AndaConstants.h
file saya yang diimpor dalampch
file saya .sumber
Dengan kelas Versi yang terkandung dalam proyek versi nv-ios (Lisensi Apache, Versi 2.0), mudah untuk mendapatkan dan membandingkan versi iOS. Contoh kode di bawah ini membuang versi iOS dan memeriksa apakah versi lebih besar dari atau sama dengan 6.0.
Halaman Proyek: nv-ios-versi
TakahikoKawasaki / nv-ios-version
Blog: Dapatkan dan bandingkan versi iOS saat runtime dengan kelas Versi
Dapatkan dan bandingkan versi iOS saat runtime dengan kelas Versi
sumber
Cara baru untuk memeriksa versi sistem menggunakan swift Forget [[UIDevice currentDevice] systemVersion] dan NSFoundationVersionNumber.
Kita dapat menggunakan NSProcessInfo -isOperatingSystemAtLeastVersion
sumber
UIDevice + IOSVersion.h
UIDevice + IOSVersion.m
sumber
Secara umum lebih baik untuk bertanya apakah suatu objek dapat melakukan pemilih yang diberikan, daripada memeriksa nomor versi untuk memutuskan apakah harus hadir.
Ketika ini bukan opsi, Anda harus sedikit berhati-hati di sini karena
[@"5.0" compare:@"5" options:NSNumericSearch]
pengembalianNSOrderedDescending
yang mungkin tidak dimaksudkan sama sekali; Saya mungkin berharap diNSOrderedSame
sini. Setidaknya ini adalah kekhawatiran teoretis, yang layak dipertahankan menurut saya.Juga patut dipertimbangkan adalah kemungkinan input versi buruk yang tidak dapat dibandingkan secara masuk akal. Apple memasok tiga konstanta yang telah ditentukan
NSOrderedAscending
,NSOrderedSame
danNSOrderedDescending
tetapi saya bisa memikirkan penggunaan untuk beberapa hal yang disebutNSOrderedUnordered
jika saya tidak dapat membandingkan dua hal dan saya ingin mengembalikan nilai yang menunjukkan ini.Terlebih lagi, bukan tidak mungkin bahwa suatu hari Apple akan memperluas tiga konstanta yang telah ditentukan sebelumnya untuk memungkinkan berbagai nilai pengembalian, membuat perbandingan menjadi
!= NSOrderedAscending
tidak bijaksana.Dengan ini, pertimbangkan kode berikut.
sumber
Di mana tentu saja,
NSFoundationVersionNumber_iOS_6_1
harus diubah agar berlaku untuk versi iOS yang ingin Anda periksa. Apa yang saya tulis sekarang mungkin akan banyak digunakan ketika menguji apakah perangkat menjalankan iOS7 atau versi sebelumnya.sumber
sedikit terlambat ke pesta tetapi mengingat iOS 8.0 di luar sana ini mungkin relevan:
jika Anda dapat menghindari menggunakan
[[UIDevice currentDevice] systemVersion]
Alih-alih memeriksa keberadaan metode / kelas / apa pun.
Saya menemukan itu berguna untuk manajer lokasi di mana saya harus memanggil requestWhenInUseAuthorization for iOS 8.0 tetapi metode ini tidak tersedia untuk iOS <8
sumber
sumber
Saya tahu ini adalah pertanyaan lama, tetapi seseorang seharusnya menyebutkan makro waktu kompilasi
Availability.h
. Semua metode lain di sini adalah solusi runtime, dan tidak akan berfungsi dalam file header, kategori kelas, atau definisi ivar.Untuk situasi ini, gunakan
h / t jawaban ini
sumber
Kemudian tambahkan kondisi if sebagai berikut: -
sumber
Ada versi seperti 7.0 atau 6.0.3, jadi kita dapat dengan mudah mengkonversi versi menjadi angka untuk dibandingkan. jika versinya seperti 7.0, cukup tambahkan ".0" lainnya dan ambil nilai numeriknya.
Untuk 6.0.0
untuk 7.0
sumber
6.1.10
. maka algoritma ini akan menghasilkan6110 > 700
, yang tidak benar.Coba kode di bawah ini:
sumber
Hanya untuk mengambil nilai string versi OS:
sumber
Sebagai variasi dari solusi yasimturks, saya mendefinisikan satu fungsi dan beberapa nilai enum alih-alih lima makro. Saya merasa lebih elegan, tapi itu masalah selera.
Pemakaian:
file .h:
file .m:
Anda harus menambahkan awalan aplikasi Anda ke nama-nama, terutama untuk
Comparison
jenisnya.sumber
Menggunakan cara yang disarankan yang direferensikan ... jika tidak ada definisi dalam file header, Anda selalu bisa mendapatkan versión mencetaknya di konsol dengan perangkat versión IOS yang diinginkan.
sumber
Solusi untuk memeriksa versi iOS di Swift
Con dari solusi ini: itu hanya praktik buruk untuk memeriksa terhadap nomor versi OS, apa pun cara Anda melakukannya. Seseorang seharusnya tidak pernah ketergantungan kode dengan cara ini, selalu memeriksa fitur, kemampuan atau keberadaan kelas. Pertimbangkan ini; Apple dapat merilis versi kelas yang kompatibel ke belakang, jika mereka melakukannya maka kode yang Anda sarankan tidak akan pernah menggunakannya karena logika Anda mencari nomor versi OS dan BUKAN keberadaan kelas.
( Sumber informasi ini )
Solusi untuk memeriksa keberadaan kelas di Swift
Jangan gunakan
if (NSClassFromString("UIAlertController") == nil)
karena berfungsi dengan benar pada simulator iOS menggunakan iOS 7.1 dan 8.2, tetapi jika Anda menguji pada perangkat nyata menggunakan iOS 7.1, Anda sayangnya akan melihat bahwa Anda tidak akan pernah melewati bagian lain dari potongan kode.sumber
sumber
Versi yang lebih umum dalam Obj-C ++ 11 (Anda mungkin bisa mengganti beberapa hal ini dengan fungsi NSString / C, tetapi ini kurang bertele-tele. Ini memberi Anda dua mekanisme. SplitSystemVersion memberi Anda array semua bagian yang berguna jika Anda hanya ingin mengaktifkan versi utama (mis
switch([self splitSystemVersion][0]) {case 4: break; case 5: break; }
.).sumber
Coba ini
sumber
sumber
float versionToBeCompared = 3.1.3;
bahkan tidak bisa dikompilasi.Contoh cepat yang benar-benar berfungsi:
Jangan gunakan NSProcessInfo karena tidak berfungsi di bawah 8.0, jadi itu cukup berguna sampai 2016
sumber
Ini adalah versi cepat:
Pemakaian:
sumber
struct iOSVersion { static let SYS_VERSION_FLOAT = (UIDevice.currentDevice().systemVersion as NSString).floatValue static let iOS7 = (iOSVersion.SYS_VERSION_FLOAT < 8.0 && iOSVersion.SYS_VERSION_FLOAT >= 7.0) static let iOS8 = (iOSVersion.SYS_VERSION_FLOAT >= 8.0 && iOSVersion.SYS_VERSION_FLOAT < 9.0) static let iOS9 = (iOSVersion.SYS_VERSION_FLOAT >= 9.0 && iOSVersion.SYS_VERSION_FLOAT < 10.0) }