由于各種原因,程序需要兼容iOS以前的版本,那么設置一個較低的部署目標和基于特定iOS版本的代碼分支,就顯得很有必要了。 舉個例子: 以前我們判斷iOS版本會如下寫:
if ([[[UIDevice currentDevice].systemVersion substringToIndex:1] intValue] >= 7) { // iOS 7.0 及以后的版本 } else { // iOS 7.0 以前的版本 }但在iOS 10.0以后,如果這樣寫就會有問題,因為iOS 10.0會被檢測成 iOS 1.0了。所以說這個方法已經行不通了。
if ([[UIDevice currentDevice].systemVersion compare:@"7.0" options:NSNumericSearch] != NSOrderedAscending) { // iOS 7.0 及以后的版本 } else { // iOS 7.0 以前的版本 }或者:
if (NSFoundationVersionNumber >= NSFoundationVersionNumber_iOS_7_0) { // iOS 7.0 及以后的版本} else { // iOS 7.0 以前的版本}或者:if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_7_0) { // iOS 7.0 及以后的版本} else { // iOS 7.0 以前的版本}當然在iOS8.0中,Apple也提供了NSPRocessInfo 這個類來檢測版本問題。
所以可以這樣檢測:
if ([[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion){.majorVersion = 8, .minorVersion = 3, .patchVersion = 0}]) { // iOS 8.3 及以后的版本} else { // iOS 8.3 以前的版本}以為考慮到NSProcessInfo 是在iOS8.0才添加進來的,所以還是有它的局限性。
下面,我以UIAlertViewController 來說明。
NS_CLASS_AVAILABLE_IOS(8_0) 這個宏說明,UIAlertViewController 是在iOS8.0才被引進來的API,那如果我們在iOS7.0上使用,應用程序就會掛掉,那么如何在iOS8.0及以后的版本使用UIAlertViewController ,而在iOS8.0以前的版本中仍然使用UIAlertView 呢?
這里我們會介紹一下在#import <AvailabilityInternal.h> 中的兩個宏定義:
__ipHONE_OS_VERSION_MIN_REQUIRED
__IPHONE_OS_VERSION_MAX_ALLOWED
從字面意思就可以直到,__IPHONE_OS_VERSION_MIN_REQUIRED 表示iPhone支持最低的版本系統,__IPHONE_OS_VERSION_MAX_ALLOWED 表示iPhone允許最高的系統版本。
__IPHONE_OS_VERSION_MAX_ALLOWED 的取值來自iOS SDK的版本,比如我現在使用的是Xcode Version 8.2.1(8C1002),SDK版本是iOS 10.2,怎么看Xcode里SDK的iOS版本呢?
進入PROJECT,選擇Build Setting,在Architectures中的Base SDK中可以查看當前的iOS SDK版本。
打印這個宏,可以看到它一直輸出100200。
__IPHONE_OS_VERSION_MIN_REQUIRED 的取值來自項目TARGETS的Deployment Target,即APP愿意支持的最低版本。如果我們修改它為8.2,打印這個宏,會發現輸出80200,默認為10.2。
通常,__IPHONE_OS_VERSION_MAX_ALLOWED 可以代表當前的SDK的版本,用來判斷當前版本是否開始支持或具有某些功能。而__IPHONE_OS_VERSION_MIN_REQUIRED 則是當前SDK支持的最低版本,用來判斷當前版本是否仍然支持或具有某些功能。
回到UIAlertViewController 使用的問題,我們就可以使用這些宏,添加版本檢測判斷,從而使我們的代碼更健壯。
參考鏈接:
http://www.360doc.com/content/14/0521/10/11029609_379561686.shtmlhttp://www.tuicool.com/articles/3InIjavhttps://segmentfault.com/a/1190000006174131http://www.tuicool.com/articles/NrmAzmv新聞熱點
疑難解答