首页 > 系统 > iOS > 正文

iOS开发之版本检测

2019-11-06 09:53:19
字体:
来源:转载
供稿:网友

由于各种原因,程序需要兼容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 这个类来检测版本问题。

@property (readonly) NSOperatingSystemVersion operatingSystemVersion NS_AVAILABLE(10_10, 8_0);- (BOOL) isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion)version NS_AVAILABLE(10_10, 8_0);

所以可以这样检测:

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) @interface UIAlertController : UIViewController

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 使用的问题,我们就可以使用这些宏,添加版本检测判断,从而使我们的代码更健壮。

- (void)showAlertView {#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_9_0 UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Title" message:@"message" delegate:nil cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil]; [alertView show];#else if (NSFoundationVersionNumber >= NSFoundationVersionNumber_iOS_8_0) { UIAlertController *alertViewController = [UIAlertController alertControllerWithTitle:@"Title" message:@"message" preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil]; UIAlertAction *otherAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil]; [alertViewController addAction:cancelAction]; [alertViewController addAction:otherAction]; [self presentViewController:alertViewController animated:YES completion:NULL]; }#endif}

参考链接:

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
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表