預料到開發者對檢查系統版本同時又對Swift友好的API的需求,iOS 8在NSProcessInfo中引入了operatingSystemVersion屬性和 isOperatingSystemAtLeastVersion方法。兩個API都使用了新的NSOperatingSystemVersion數值類 型,它包括majorVersion、minorVersion和patchVersion。
Tips:蘋果軟件發布的版本號遵循語義化版本約定。
對一個簡單的檢查,比如“這個app能在iOS 8運行嗎?” isOperatingSystemAtLeastVersion是最簡單明了的方式。
if NSProcessInfo().isOperatingSystemAtLeastVersion(NSOperatingSystemVersion(majorVersion: 8, minorVersion: 0, patchVersion: 0)) { print("iOS >= 8.0.0") }
為了更復雜的版本比較,operatingSystemVersion能夠被直接檢查。將它和Swift模式比較和switch語句組合,可以使得代碼更簡潔。
let os = NSProcessInfo().operatingSystemVersion switch (os.majorVersion, os.minorVersion, os.patchVersion) { case (8, _, _): print("iOS >= 8.0.0") case (7, 0, _): print("iOS >= 7.0.0, < 7.1.0") case (7, _, _): print("iOS >= 7.1.0, < 8.0.0") default: print("iOS < 7.0.0") }
可惜的是,新NSProcessInfo API目前並不是特別有用,因為它們在iOS 7上不生效。
作為替代,可以使用systemVersion屬性UIDevice來進行檢查:
if UIDevice.currentDevice().systemVersion == "8.0.0"{ print("ios = 8.0.0") }
另一個確定API可用性的方法是檢查框架的版本號。不幸的是,Foundation的NSFoundationVersionNumber和Core Foundation的kCFCoreFoundationVersionNumber很早之前就過時了,但過去幾個版本的OS發布並沒有更新這兩個常量。
這對於iOS來說是無解的,但OS X還可以通過NSAppKitVersionNumber檢查AppKit的版本號:
if rint(NSAppKitVersionNumber) > NSAppKitVersionNumber10_9 { print("OS X >= 10.10") }
Tips:蘋果在示例代碼中使用rint來完成NSAppKitVersionNumber的版本號比較。
將以上的總結一下,在Swift中檢查系統版本總共有以下方法。