原文链接: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常量进行对比。
本文介绍了如何在Swift中检查系统版本,包括使用`NSProcessInfo`的`isOperatingSystemAtLeastVersion`和`operatingSystemVersion`方法,以及`NSAppKitVersionNumber`来判断API的可用性。在iOS 8及以上版本,推荐使用`isOperatingSystemAtLeastVersion`,而在早期版本或OS X上,可能需要依赖框架版本号进行判断。
5940

被折叠的 条评论
为什么被折叠?



