ios - 如何检查iOS版本?

  显示原文与译文双语对照的内容

我想检查设备的iOS 版本是否大于 3.1.3 。我尝试了以下操作:


[[UIDevice currentDevice].systemVersion floatValue]

但它不起作用,我只需要:


if (version> 3.1.3) { }

我如何实现这个?

时间:

快速回答 。。

[[NSProcessInfo processInfo] operatingSystemVersion] 在 iOS 8和更高版本中。

但是,你应该避免依靠操作系统版本来表示设备或者操作系统功能。 通常有一种更可靠的方法来检查某个特性或者类是否可用。

对api存在的检查:

例如你可以检查 UIPopoverController 是否在当前设备上使用 NSClassFromString:


if(NSClassFromString(@"UIPopoverController")) {
//Do something
}

对于弱链接类,可以直接对该类进行消息传递。 值得注意的是,这适用于没有显式链接为"所需"的框架。 对于缺失的类,表达式计算为 nil,但失败:


if([LAContext class]) {
//Do something
}

一些类,如 CLLocationManagerUIDevice,提供检查设备功能的方法:


if([CLLocationManager headingAvailable]) {
//Do something
}

检查符号是否存在:

偶尔,你必须检查是否存在常量。 在 iOS 8中引入了 UIApplicationOpenSettingsURLString,它用于通过 -openURL: 加载设置应用。 在 iOS 8之前,该值不存在。 将nil传递给这个API会崩溃,所以你必须先确认常量是否存在:


if (&UIApplicationOpenSettingsURLString!= NULL) {
 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
}

操作系统版本进行比较时,比较:

假设你面对的是相对很少的检查操作系统版本的需求。 对于目标为 iOS 8和更高版本的项目,NSProcessInfo 包含了一种执行版本比较的方法,但出错几率较低:


- (BOOL)isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion)version

项目针对旧系统可以使用 systemVersionUIDevice 。 苹果在他们的GLSprite 示例代码中使用它。


//A system version of 3.1 or greater is required to use CADisplayLink. The NSTimer
//class is used as fallback when it isn't available.
NSString *reqSysVer = @"3.1";
NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
if ([currSysVer compare:reqSysVer options:NSNumericSearch]!= NSOrderedAscending)
 displayLinkSupported = TRUE;

如果出于任何原因,你决定 systemVersion 是你想要的,请确保将它当作字符串,或者你有风险截断补丁修订号( 例如。 3.1.2 -> 3.1.


/*
 * System Versioning Preprocessor Macros
 */

#define SYSTEM_VERSION_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)
#define SYSTEM_VERSION_GREATER_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch]!= NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch]!= NSOrderedDescending)

/*
 * Usage
 */

if (SYSTEM_VERSION_LESS_THAN(@"4.0")) {
. . .
}

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"3.1.1")) {
. . .
}

就像官方Apple文档 。xml所建议的: 你可以使用 NSFoundationVersionNumber,来自 NSObjCRuntime.h 头文件。


if (floor(NSFoundationVersionNumber)> NSFoundationVersionNumber_iOS_6_1) {
//here you go with iOS 7
}

尝试以下方法:


NSComparisonResult order = [[UIDevice currentDevice].systemVersion compare: @"3.1.3" options: NSNumericSearch];
if (order == NSOrderedSame || order == NSOrderedDescending) {
//OS version> = 3.1.3
} else {
//OS version <3.1.3
}

我推荐:


if ([[[UIDevice currentDevice] systemVersion] floatValue]> 3.13) {
 ;//...
}

贷项:http://stackoverflow.com/questions/820142/how-to-target-a-specific-iphone-version

这用于在Xcode中检查兼容的SDK版本:


#if __IPHONE_OS_VERSION_MAX_ALLOWED> = 80000
//at least iOS 8 code here
#else
//lower than iOS 8 code here 
#endif

你可以将 __IPHONE_OS_VERSION_MAX_ALLOWED> = 70000用于 iOS 7等。

用于检查设备或者模拟器上兼容的操作系统:


if ([[[UIDevice currentDevice] systemVersion] floatValue] <8.0) {
//older than iOS 8 code here
} else {
//iOS 8 specific code here
}


+(BOOL)doesSystemVersionMeetRequirement:(NSString *)minRequirement{

//eg NSString *reqSysVer = @"4.0";


 NSString *currSysVer = [[UIDevice currentDevice] systemVersion];

 if ([currSysVer compare:minRequirement options:NSNumericSearch]!= NSOrderedAscending)
 {
 return YES;
 }else{
 return NO;
 }


}

在 iOS 8中新增的是 NSProcessInfo,它与 Swift 集成得很好,支持更好的语义版本控制。

在 iOS 8上部署

最低部署目标 iOS 8.0或以上,使用 NSProcessInfooperatingSystemVersion 或者 isOperatingSystemAtLeastVersion

这将产生以下结果:


let minimumVersion = NSOperatingSystemVersion(majorVersion: 8, minorVersion: 1, patchVersion: 2)
if NSProcessInfo().isOperatingSystemAtLeastVersion(minimumVersion) {
//current version is> = (8.1.2)
} else {
//current version is <(8.1.2)
}

在 iOS 7上部署

对于 7.1 或者更高版本的最低部署目标,请与 NSStringCompareOptions.NumericSearchUIDevice systemVersion 上。

这将产生以下结果:


let minimumVersionString ="3.1.3"
let versionComparison: NSComparisonResult = UIDevice.currentDevice().systemVersion.compare(minimumVersionString, options: NSStringCompareOptions.NumericSearch)
case. OrderedSame,. OrderedDescending: {
//current version is> = (3.1.3)
}
case. OrderedAscending: {
//current version is <(3.1.3)
}

更多关于 NSHipster的阅读。

使用 nv-ios-version 项目( Apache许可证,版本 2.0 ) 中包含的的版本类,可以轻松获取和比较iOS版本。 下面的示例代码转储了iOS版本,并检查该版本是否大于或者等于 6.0.


//Get the system version of iOS at runtime.
NSString *versionString = [[UIDevice currentDevice] systemVersion];

//Convert the version string to a Version instance.
Version *version = [Version versionWithString:versionString];

//Dump the major, minor and micro version numbers.
NSLog(@"version = [%d, %d, %d]",
 version.major, version.minor, version.micro);

//Check whether the version is greater than or equal to 6.0.
if ([version isGreaterThanOrEqualToMajor:6 minor:0])
{
//The iOS version is greater than or equal to 6.0.
}

//Another way to check whether iOS version is
//greater than or equal to 6.0.
if (6 <= version.major)
{
//The iOS version is greater than or equal to 6.0.
}

项目页面:nv-ios-version
https://github.com/TakahikoKawasaki/nv-ios-version

博客:使用版本类在运行时获取和比较iOS版本
http://darutk-oboegaki.blogspot.jp/2013/04/get-and-compare-ios-version-at-runtime.html

...