如何查看 iOS 版本?

[[UIDevice currentDevice].systemVersion floatValue]
if (version > 3.1.3) { }

答案

/*
 *  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")) {
    ...
}

快速答案...


从 Swift 2.0 开始,您可以在ifguard使用#available来保护仅应在某些系统上运行的代码。

if #available(iOS 9, *) {}


在 Objective-C 中,您需要检查系统版本并进行比较。

iOS 8 及更高版本中的[[NSProcessInfo processInfo] operatingSystemVersion]

从 Xcode 9 开始:

if (@available(iOS 9, *)) {}


完整答案...

在 Objective-C 和 Swift(在极少数情况下)中,最好避免依赖操作系统版本作为设备或 OS 功能的指示。通常,有一种更可靠的方法来检查特定功能或类是否可用。

检查 API 是否存在:

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

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

对于弱链接的类,可以直接向该类发送消息是安全的。值得注意的是,这适用于未显式链接为 “必需” 的框架。对于缺少的类,表达式的计算结果为 nil,不满足以下条件:

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

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

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

检查符号是否存在:

有时,您必须检查常量的存在。这是在 iOS 8 中引入的UIApplicationOpenSettingsURLString引入的,该UIApplicationOpenSettingsURLString用于通过-openURL:加载 “设置” 应用程序。该值在 iOS 8 之前不存在。向该 API 传递 nil 将会崩溃,因此您必须首先确保验证常量的存在:

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

与操作系统版本比较:

假设您面对检查操作系统版本的需求相对较少。对于面向 iOS 8 及更高版本的项目, NSProcessInfo包含一种用于执行版本比较的方法,错误发生的机会更少:

- (BOOL)isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion)version

针对较旧系统的项目可以在UIDevice上使用systemVersion 。 Apple 在其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)。

正如建议苹果官方文档 :您可以使用NSFoundationVersionNumber ,从NSObjCRuntime.h头文件。

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

Objective-C 中启动 Xcode 9:

if (@available(iOS 11, *)) {
    // iOS 11 (or newer) ObjC code
} else {
    // iOS 10 or older code
}

Swift 中启动 Xcode 7:

if #available(iOS 11, *) {
    // iOS 11 (or newer) Swift code
} else {
    // iOS 10 or older code
}

对于版本,可以指定 MAJOR,MINOR 或 PATCH(有关定义,请参见http://semver.org/ )。例子:

  • iOS 11iOS 11.0是相同的最低版本
  • iOS 10iOS 10.3iOS 10.3.1是不同的最低版本

您可以输入以下任何系统的值:

  • iOSmacOSwatchOStvOS

我的一个吊舱中获取的真实案例示例:

if #available(iOS 10.0, tvOS 10.0, *) {
    // iOS 10+ and tvOS 10+ Swift code
} else {
    // iOS 9 and tvOS 9 older code
}

文件资料

这用于检查 Xcode 中兼容的 SDK 版本,这是如果您有一个拥有不同 Xcode 版本的大型团队或支持共享相同代码的不同 SDK 的多个项目:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
  //programming in iOS 8+ SDK here
#else
  //programming in lower than iOS 8 here   
#endif

您真正想要的是检查设备上的 iOS 版本。您可以这样做:

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

迅捷版:

if let version = Float(UIDevice.current.systemVersion), version < 9.3 {
    //add lower than 9.3 code here
} else {
    //add 9.3 and above code here
}

swift 的当前版本应使用以下版本:

if #available(iOS 12, *) {
    //iOS 12 specific code here
} else {
    //older than iOS 12 code here
}

尝试:

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
}

首选方法

在 Swift 2.0 中,Apple 使用了更为方便的语法添加了可用性检查( 在此处了解更多信息 )。现在,您可以使用更简洁的语法检查操作系统版本:

if #available(iOS 9, *) {
    // Then we are on iOS 9
} else {
    // iOS 8 or earlier
}

这比检查respondsToSelector等( Swift 的新增功能 )优先。现在,如果您没有适当地保护代码,编译器将始终警告您。


迅捷版 2.0

iOS 8 中的新功能是NSProcessInfo允许进行更好的语义版本检查。

在 iOS 8 及更高版本上进行部署

对于iOS 8.0或更高版本的最低部署目标,请使用NSProcessInfo operatingSystemVersionisOperatingSystemAtLeastVersion

这将产生以下结果:

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 上部署

对于iOS 7.1或更低版本的最低部署目标,请在UIDevice systemVersion上与NSStringCompareOptions.NumericSearch进行比较。

这将产生:

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

NSHipster 上阅读更多内容。

我总是将它们保存在我的 Constants.h 文件中:

#define IS_IPHONE5 (([[UIScreen mainScreen] bounds].size.height-568)?NO:YES) 
#define IS_OS_5_OR_LATER    ([[[UIDevice currentDevice] systemVersion] floatValue] >= 5.0)
#define IS_OS_6_OR_LATER    ([[[UIDevice currentDevice] systemVersion] floatValue] >= 6.0)
#define IS_OS_7_OR_LATER    ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
#define IS_OS_8_OR_LATER    ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
+(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;
  }


}

使用nv-ios-version项目(Apache 许可证,版本 2.0)中包含的Version类,可以轻松获取和比较 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
川崎孝彦 / nv-ios-version

博客:在运行时使用 Version 类获取并比较 iOS 版本
在运行时使用 Version 类获取并比较 iOS 版本