协慌网

登录 贡献 社区

如何查看 iOS 版本?

我想检查设备的iOS版本是否大于3.1.3我试过这样的事情:

[[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 中,在极少数情况下,最好避免依赖操作系统版本作为设备或操作系统功能的指示。通常有一种更可靠的方法来检查特定要素或类是否可用。

检查是否存在 API:

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

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

对于弱链接类,直接向类消息是安全的。值得注意的是,这适用于未明确链接为 “必需” 的框架。对于缺少的类,表达式的计算结果为 nil,条件不正确:

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

某些类(如CLLocationManagerUIDevice )提供了检查设备功能的方法:

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

检查是否存在符号:

偶尔,您必须检查是否存在常数。这在 iOS 8 中引入了UIApplicationOpenSettingsURLString ,用于通过-openURL:加载设置应用程序-openURL: 。在 iOS 8 之前该值不存在。将 nil 传递给此 API 将崩溃,因此您必须首先检查常量是否存在:

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
}