Swift中的系统版本确认

本文介绍了如何在Swift中检查系统版本,包括使用`NSProcessInfo`的`isOperatingSystemAtLeastVersion`和`operatingSystemVersion`方法,以及`NSAppKitVersionNumber`来判断API的可用性。在iOS 8及以上版本,推荐使用`isOperatingSystemAtLeastVersion`,而在早期版本或OS X上,可能需要依赖框架版本号进行判断。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文链接:http://nshipster.com/swift-system-version-checking/

前言

C VS Swift

  • C不安全 (这里主要指指针的使用)
  • C中有未定义的行为 (只声明,不初始化)
  • C中的预处理器解释功能缺陷

OC中的API检查主要是通过C预处理根据当前classs发送respondsToSelector:instancesRespondToSelector:来达成的:

#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
if ([NSURLSession class] &&
    [NSURLSessionConfiguration respondsToSelector:@selector(backgroundSessionConfigurationWithIdentifier:)]) {
    // ...
}
#endif

Swift根据特定系统以及指令集架构对编译器做了完全的限制。

#if DEBUG
     println("OTHER_SWIFT_FLAGS = -D DEBUG")
#endif

Function Valid Arguments
os() OSX, iOS
arch() x86_64, arm, arm64, i386

#if os(iOS)
    var image: UIImage?
#elseif os(OSX)
    var image: NSImage?
#endif

不幸的是,os()没有提供OS X与iOS特定的版本号,这也意味着我们只能在运行时进行检查。

NSProcessInfo

为了让Swift增加运行时API版本判断的接口友好性,iOS8在NSProcessInfo类增加了operatingSystemVersion属性以及isOperatingSystemAtLeastVersion方法。

isOperatingSystemAtLeastVersion

为了检验APP是不是在iOS8上跑,isOperatingSystemAtLeastVersion方法是最直接的方法:

if NSProcessInfo().isOperatingSystemAtLeastVersion(NSOperatingSystemVersion(majorVersion: 8, minorVersion: 0, patchVersion: 0)) {
    println("iOS >= 8.0.0")
}

operatingSystemVersion

若想做版本对比,可以直接校验operatingSystemVersion属性,配上Swift中的switch语句。

let os = NSProcessInfo().operatingSystemVersion
switch (os.majorVersion, os.minorVersion, os.patchVersion) {
case (8, _, _):
    println("iOS >= 8.0.0")
case (7, 0, _):
    println("iOS >= 7.0.0, < 7.1.0")
case (7, _, _):
    println("iOS >= 7.1.0, < 8.0.0")
default:
    println("iOS < 7.0.0")
}

注意:使用NSStringCompareOptions.NumericSearch进行版本字符串数值比较的时候,举个栗子:
"2.5" < "2.10"。

使用NSComparisonResult效果也是一样的。

NSAppKitVersionNumber

另外一个确认API是否可用的方式是去校验框架版本号。不幸的是,FoundationNSFoundationVersionNumberCore FoundationkCFCoreFoundationVersionNumber已经弥久未更了。
但是在OS XAPPKit中的NSAppKitVersionNumber我们还是能够获取我们想要的信息:

if rint(NSAppKitVersionNumber) > NSAppKitVersionNumber10_9 {
    println("OS X >= 10.10")
}

使用rint先四舍五入版本号后再与NSAppKitVersionNumber做比较。

总结

Swift中系统版本号校验须知:

  • 使用#if os(iOS)预处理器来判断目标对象是iOS (UIKit)亦或是OS X (AppKit)
  • 最小配置对象如果是8.0以上,使用NSProcessInfo operatingSystemVersion或者isOperatingSystemAtLeastVersion
  • 如果配置对象是7.1以下,在UIDevice systemVersion使用compare中的NSStringCompareOptions.NumericSearch进行版本确认。
  • 如果是OS X上的部署,可以使用AppKit中的NSAppKitVersionNumber常量进行对比。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值