原文链接: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是否可用的方式是去校验框架版本号。不幸的是,Foundation
中NSFoundationVersionNumber
与Core Foundation
中kCFCoreFoundationVersionNumber
已经弥久未更了。
但是在OS X
的APPKit
中的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
常量进行对比。