在iOS開發(fā)過(guò)程中娄昆,如果要使用到一些跟特定系統(tǒng)版本特性有關(guān)的功能尤莺,或者要適配低版本系統(tǒng)的用戶九串,還有一些方法是新版本系統(tǒng)才有的踢步,有一些方法在新版本中已經(jīng)棄用了癣亚,這都需要對(duì)不同系統(tǒng)版本的設(shè)備進(jìn)行分別的處理,而這有個(gè)前提就是判斷系統(tǒng)的版本號(hào)获印。
判斷系統(tǒng)版本號(hào)有多種方法述雾,這里都列出來(lái)供大家和自己在開發(fā)中需要時(shí)進(jìn)行選擇使用。
方法一:直接獲取系統(tǒng)版本
iOS提供了直接獲取系統(tǒng)版本號(hào)的方法:
NSString *version = [UIDevice currentDevice].systemVersion;
if (version.doubleValue >= 9.0) {
// 針對(duì) 9.0 以上的iOS系統(tǒng)進(jìn)行處理
} else {
// 針對(duì) 9.0 以下的iOS系統(tǒng)進(jìn)行處理
}
這種方法應(yīng)該說(shuō)也是最常見(jiàn)和常用的方法了兼丰。
方法二:通過(guò)Foundation框架版本號(hào)
iOS系統(tǒng)升級(jí)時(shí)Foundation框架也會(huì)升級(jí)版本號(hào)玻孟,我們可以通過(guò)獲取Foundation的版本號(hào)來(lái)判斷對(duì)應(yīng)的iOS版本,這個(gè)iOS也提供了很直觀的宏來(lái)進(jìn)行判斷:
#if TARGET_OS_IPHONE
#define NSFoundationVersionNumber_iPhoneOS_2_0 678.24
#define NSFoundationVersionNumber_iPhoneOS_2_1 678.26
#define NSFoundationVersionNumber_iPhoneOS_2_2 678.29
#define NSFoundationVersionNumber_iPhoneOS_3_0 678.47
#define NSFoundationVersionNumber_iPhoneOS_3_1 678.51
#define NSFoundationVersionNumber_iPhoneOS_3_2 678.60
#define NSFoundationVersionNumber_iOS_4_0 751.32
#define NSFoundationVersionNumber_iOS_4_1 751.37
#define NSFoundationVersionNumber_iOS_4_2 751.49
#define NSFoundationVersionNumber_iOS_4_3 751.49
#define NSFoundationVersionNumber_iOS_5_0 881.00
#define NSFoundationVersionNumber_iOS_5_1 890.10
#define NSFoundationVersionNumber_iOS_6_0 992.00
#define NSFoundationVersionNumber_iOS_6_1 993.00
#define NSFoundationVersionNumber_iOS_7_0 1047.20
#define NSFoundationVersionNumber_iOS_7_1 1047.25
#define NSFoundationVersionNumber_iOS_8_0 1140.11
#define NSFoundationVersionNumber_iOS_8_1 1141.1
#define NSFoundationVersionNumber_iOS_8_2 1142.14
#define NSFoundationVersionNumber_iOS_8_3 1144.17
#define NSFoundationVersionNumber_iOS_8_4 1144.17
#define NSFoundationVersionNumber_iOS_8_x_Max 1199
#define NSFoundationVersionNumber_iOS_9_0 1240.1
#define NSFoundationVersionNumber_iOS_9_1 1241.14
#define NSFoundationVersionNumber_iOS_9_2 1242.12
#define NSFoundationVersionNumber_iOS_9_3 1242.12
#define NSFoundationVersionNumber_iOS_9_4 1280.25
#define NSFoundationVersionNumber_iOS_9_x_Max 1299
#endif
可以看到鳍征,最上面判斷了這是iPhone的系統(tǒng)黍翎,相應(yīng)的還有Mac的系統(tǒng)。這些都是NSFoundationVersionNumber這個(gè)宏定義的值艳丛,我們可以判斷它來(lái)獲取當(dāng)前設(shè)備的系統(tǒng)版本匣掸,用法如下:
if (NSFoundationVersionNumber >= NSFoundationVersionNumber_iOS_9_0) {
// iOS 9.0 以上系統(tǒng)的處理
} else {
// iOS 9.0 以下系統(tǒng)的處理
}
方法三:根據(jù)特有的類判斷
我們之前說(shuō)有些類和方法是新版本才有的,要使用的時(shí)候要判斷一下版本號(hào)氮双,但也可以反過(guò)來(lái)利用這一點(diǎn)碰酝,判斷有沒(méi)有這個(gè)類從而得知當(dāng)前的版本號(hào)范圍。
比如說(shuō) UIAlertController 這個(gè)類眶蕉,是iOS 8之后才出現(xiàn)的砰粹,用來(lái)取代 UIAlertView 和 UIActionsheet 的,如果當(dāng)前系統(tǒng)沒(méi)有這個(gè)類造挽,說(shuō)明是低于iOS 8的,可以這么判斷:
if (NSClassFromString(@"UIAlertController")) { // 存在這個(gè)類
// iOS 8.0 以上系統(tǒng)的處理
} else {
// iOS 8.0 以下系統(tǒng)的處理
}
方法四:根據(jù)特有的方法進(jìn)行判斷
類似于根據(jù)特有的類來(lái)判斷弄痹,有些方法也是某個(gè)系統(tǒng)版本之后才出現(xiàn)的饭入,根據(jù)有無(wú)這個(gè)方法即可得知當(dāng)前版本號(hào)的范圍,比如 boundingRectWithSize:options:attributes:context: 這個(gè)方法是 iOS 7.0 之后才有的肛真,可以這樣判斷:
if ([@"" respondsToSelector:@selector(boundingRectWithSize:options:attributes:context:)]) { // 存在這個(gè)方法
// iOS 7.0 以上系統(tǒng)的處理
} else {
// iOS 7.0 以下系統(tǒng)的處理
}
其實(shí)根據(jù)類和方法來(lái)判斷直接就可以決定使用什么類和方法了谐丢,也算是跳過(guò)了先判斷系統(tǒng)然后選擇方法這一步,嚴(yán)格來(lái)說(shuō)已經(jīng)不算是為了判斷系統(tǒng)版本了蚓让。