由于各种原因,程序需要兼容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新闻热点
疑难解答