检查Swift中的操作系统版本?
我试图在Swift中检查系统信息。 我发现,这可以通过代码来实现:
var sysData:CMutablePointer<utsname> = nil let retVal:CInt = uname(sysData)
我有这个代码的两个问题:
- 什么应该是sysData的初始值? 这个例子在retVal中给出-1可能是因为sysData是零。
- 我如何从sysData中读取信息?
对于iOS,请尝试:
var systemVersion = UIDevice.current.systemVersion
对于OS X,请尝试:
var systemVersion = NSProcessInfo.processInfo().operatingSystemVersion
如果您只想检查用户是否至less运行特定版本,则还可以使用以下适用于iOS和OS X的Swift 2function:
if #available(iOS 9.0, *) { // use the feature only available in iOS 9 // for ex. UIStackView } else { // or use some work around }
但不build议检查操作系统版本。 比较版本号,最好检查一下你想使用的function是否可用。 对于iOS,如上所述,您应该检查它是否响应select器; 例如。:
if (self.respondsToSelector(Selector("showViewController"))) { self.showViewController(vc, sender: self) } else { // some work around }
更新:
现在您应该使用Swift 2引入的新的可用性检查 :
例如要在编译时检查iOS 9.0或更高版本,请使用以下命令:
if #available(iOS 9.0, *) { // use UIStackView } else { // show sad face emoji }
或者可以与整个方法或类一起使用
@available(iOS 9.0, *) func useStackView() { // use UIStackView }
欲了解更多信息,请参阅。
运行时间检查:
如果你不想要确切的版本,但想要检查iOS 9,10或11使用if:
let floatVersion = (UIDevice.current.systemVersion as NSString).floatValue
编辑:刚刚find另一种方式来实现这一点:
let iOS8 = floor(NSFoundationVersionNumber) > floor(NSFoundationVersionNumber_iOS_7_1) let iOS7 = floor(NSFoundationVersionNumber) <= floor(NSFoundationVersionNumber_iOS_7_1)
我做了从下面的链接转移到快速辅助function:
我们如何以编程方式检测哪个iOS版本的设备正在运行?
func SYSTEM_VERSION_EQUAL_TO(version: String) -> Bool { return UIDevice.currentDevice().systemVersion.compare(version, options: NSStringCompareOptions.NumericSearch) == NSComparisonResult.OrderedSame } func SYSTEM_VERSION_GREATER_THAN(version: String) -> Bool { return UIDevice.currentDevice().systemVersion.compare(version, options: NSStringCompareOptions.NumericSearch) == NSComparisonResult.OrderedDescending } func SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(version: String) -> Bool { return UIDevice.currentDevice().systemVersion.compare(version, options: NSStringCompareOptions.NumericSearch) != NSComparisonResult.OrderedAscending } func SYSTEM_VERSION_LESS_THAN(version: String) -> Bool { return UIDevice.currentDevice().systemVersion.compare(version, options: NSStringCompareOptions.NumericSearch) == NSComparisonResult.OrderedAscending } func SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(version: String) -> Bool { return UIDevice.currentDevice().systemVersion.compare(version, options: NSStringCompareOptions.NumericSearch) != NSComparisonResult.OrderedDescending }
它可以像这样使用:
SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO("7.0")
我为了简单的使用这个Singleton, 创build了一个IOSVersion.swift
文件并添加了下面的代码:
import UIKit public class IOSVersion { class func SYSTEM_VERSION_EQUAL_TO(version: NSString) -> Bool { return UIDevice.currentDevice().systemVersion.compare(version, options: NSStringCompareOptions.NumericSearch) == NSComparisonResult.OrderedSame } class func SYSTEM_VERSION_GREATER_THAN(version: NSString) -> Bool { return UIDevice.currentDevice().systemVersion.compare(version as String, options: NSStringCompareOptions.NumericSearch) == NSComparisonResult.OrderedDescending } class func SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(version: NSString) -> Bool { return UIDevice.currentDevice().systemVersion.compare(version as String, options: NSStringCompareOptions.NumericSearch) != NSComparisonResult.OrderedAscending } class func SYSTEM_VERSION_LESS_THAN(version: NSString) -> Bool { return UIDevice.currentDevice().systemVersion.compare(version as String, options: NSStringCompareOptions.NumericSearch) == NSComparisonResult.OrderedAscending } class func SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(version: NSString) -> Bool { return UIDevice.currentDevice().systemVersion.compare(version as String, options: NSStringCompareOptions.NumericSearch) != NSComparisonResult.OrderedDescending } }
使用 :
IOSVersion.SYSTEM_VERSION_EQUAL_TO("8.0") IOSVersion.SYSTEM_VERSION_LESS_THAN("8.0")
谢谢@KVISH
编辑Swift 2:
if #available(iOS 9.0, *) { // 👍 } else { // 👎 }
Swift 3.0
我们不需要创build扩展,因为ProcessInfo
给我们的版本信息。 你可以看到iOS的示例代码如下。
let os = ProcessInfo().operatingSystemVersion switch (os.majorVersion, os.minorVersion, os.patchVersion) { case (8, 0, _): print("iOS >= 8.0.0, < 8.1.0") case (8, _, _): print("iOS >= 8.1.0, < 9.0") case (9, _, _): print("iOS >= 9.0.0") default: // this code will have already crashed on iOS 7, so >= iOS 10.0 println("iOS >= 10.0.0") }
参考: http : //nshipster.com/swift-system-version-checking/
如果您使用的是Swift 2,并且想要检查操作系统版本以使用某个API,则可以使用新的可用性function:
if #available(iOS 8, *) { //iOS 8+ code here. } else { //Code for iOS 7 and older versions. //An important note: if you use #availability, Xcode will also //check that you don't use anything that was introduced in iOS 8+ //inside this `else` block. So, if you try to use UIAlertController //here, for instance, it won't compile. And it's great. }
我写了这个答案,因为这是在谷歌的第一个问题, swift 2 check system version
查询。
更新Swift 3.0+
func SYSTEM_VERSION_EQUAL_TO(version: String) -> Bool { return UIDevice.current.systemVersion.compare(version, options: .numeric) == ComparisonResult.orderedSame } func SYSTEM_VERSION_GREATER_THAN(version: String) -> Bool { return UIDevice.current.systemVersion.compare(version, options: .numeric) == ComparisonResult.orderedDescending } func SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(version: String) -> Bool { return UIDevice.current.systemVersion.compare(version, options: .numeric) != ComparisonResult.orderedAscending } func SYSTEM_VERSION_LESS_THAN(version: String) -> Bool { return UIDevice.current.systemVersion.compare(version, options: .numeric) == ComparisonResult.orderedAscending } func SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(version: String) -> Bool { return UIDevice.current.systemVersion.compare(version, options: .numeric) != ComparisonResult.orderedDescending }
let Device = UIDevice.currentDevice() let iosVersion = NSString(string: Device.systemVersion).doubleValue let iOS8 = iosVersion >= 8 let iOS7 = iosVersion >= 7 && iosVersion < 8
并检查为
if(iOS8) { } else { }
马特汤普森分享一个非常方便的方式
switch UIDevice.currentDevice().systemVersion.compare("8.0.0", options: NSStringCompareOptions.NumericSearch) { case .OrderedSame, .OrderedDescending: println("iOS >= 8.0") case .OrderedAscending: println("iOS < 8.0") }
在Swift 3中检查MacOS和iOS版本
IOS
码
extension UIDevice { var iOS: Double? { if UIDevice.current.systemName == "iOS" { if let iosVersion = UIDevice.current.systemVersion.toDouble { return iosVersion } } return nil } } extension String { var toDouble: Double? { if let iosVersion = Double(self) { return iosVersion } var arr = components(separatedBy: ".") if arr.count >= 1 { var integerPart = 0 var floatPart = 0 if let _integerPart = Int(arr[0]), !arr[0].isEmpty{ integerPart = _integerPart } if let _floatPart = Int(arr[1]), !arr[1].isEmpty{ floatPart = _floatPart } return Double("\(integerPart).\(floatPart)") } return nil } }
版本string转换示例
var stringVersion = "10.1.1" print(stringVersion.toDouble!) // print 10.1 stringVersion = ".5.35" print(stringVersion.toDouble!) // print 0.5 stringVersion = "..35" print(stringVersion.toDouble!) // print 0.0
用法
if let iosVersion = UIDevice.current.iOS { if iosVersion >= 8.0 { print("current version: \(iosVersion)") } }
苹果系统
码
extension ProcessInfo { var OS: Double? { let result = "\(ProcessInfo.processInfo.operatingSystemVersion.majorVersion).\(ProcessInfo.processInfo.operatingSystemVersion.minorVersion)" return Double(result) } }
用法
// check os version if let systemVersion = ProcessInfo.processInfo.OS { if systemVersion >= 10.1 { print("current version: \(systemVersion)") } }
在Swift 2和更高版本中检查系统版本(以及许多其他版本)的最简单和最简单的方法是:
if #available(iOS 9.0, *) { // check for iOS 9.0 and later }
此外,使用#available
你可以检查这些版本:
iOS iOSApplicationExtension macOS macOSApplicationExtension watchOS watchOSApplicationExtension tvOS tvOSApplicationExtension swift
注意:在iOS 8.0和更高版本中可用。 OS X v10.10及更高版本
var majorVersion: Int { return NSProcessInfo.processInfo().operatingSystemVersion.majorVersion } var minorVersion: Int { return NSProcessInfo.processInfo().operatingSystemVersion.minorVersion } var patchVersion: Int { return NSProcessInfo.processInfo().operatingSystemVersion.patchVersion } var myOSVersion: String { return NSProcessInfo.processInfo().operatingSystemVersionString }
基于马特汤普森的答案,这里是一个方法与相应的unit testing,在iOS 7和以上 (包括iOS 9 ,不再让你检查NSFoundationNumber )与Swift和Objective-c 一起工作 :
+ (BOOL) isAtLeastOSVersion:(NSString *)osVersion { switch ([[UIDevice currentDevice].systemVersion compare:osVersion options:NSNumericSearch]) { case NSOrderedSame: case NSOrderedDescending: return YES; default: return NO; } }
。
@interface ANFakeCurrDevice : NSObject @property (nonatomic, strong) NSString *systemVersion; @end @implementation ANFakeCurrDevice @end @implementation MyHelperClassUnitTests - (void)setUp { [super setUp]; } - (void)tearDown { [super tearDown]; } - (void)test_isAtLeastOSVersion { id deviceMock = [OCMockObject niceMockForClass:[UIDevice class]]; ANFakeCurrDevice *fakeCurrDevice = [ANFakeCurrDevice new]; fakeCurrDevice.systemVersion = @"99.9.9"; [[[deviceMock stub] andReturn:fakeCurrDevice] currentDevice]; XCTAssertTrue([[UIDevice currentDevice].systemVersion isEqualToString:@"99.9.9"]); fakeCurrDevice.systemVersion = @"1.0.1"; XCTAssertTrue([ANConstants isAtLeastOSVersion:@"1"]); XCTAssertTrue([ANConstants isAtLeastOSVersion:@"1.0"]); XCTAssertTrue([ANConstants isAtLeastOSVersion:@"1.0.1"]); XCTAssertFalse([ANConstants isAtLeastOSVersion:@"1.0.2"]); XCTAssertFalse([ANConstants isAtLeastOSVersion:@"1.1.0"]); XCTAssertFalse([ANConstants isAtLeastOSVersion:@"2"]); XCTAssertFalse([ANConstants isAtLeastOSVersion:@"2.0"]); XCTAssertFalse([ANConstants isAtLeastOSVersion:@"2.0.0"]); XCTAssertFalse([ANConstants isAtLeastOSVersion:@"2.0.1"]); XCTAssertFalse([ANConstants isAtLeastOSVersion:@"2.1.0"]); fakeCurrDevice.systemVersion = @"8.4.0"; XCTAssertTrue([ANConstants isAtLeastOSVersion:@"7.0.1"]); XCTAssertTrue([ANConstants isAtLeastOSVersion:@"8"]); XCTAssertTrue([ANConstants isAtLeastOSVersion:@"8.4"]); XCTAssertFalse([ANConstants isAtLeastOSVersion:@"8.4.1"]); XCTAssertFalse([ANConstants isAtLeastOSVersion:@"8.4.2"]); XCTAssertFalse([ANConstants isAtLeastOSVersion:@"9.0"]); XCTAssertFalse([ANConstants isAtLeastOSVersion:@"9.0.1"]); XCTAssertFalse([ANConstants isAtLeastOSVersion:@"9.0.2"]); XCTAssertTrue([ANConstants isAtLeastOSVersion:@"8.4"] && ![ANConstants isAtLeastOSVersion:@"9.0"]); fakeCurrDevice.systemVersion = @"8.4.1"; XCTAssertTrue([ANConstants isAtLeastOSVersion:@"8.4"] && ![ANConstants isAtLeastOSVersion:@"9.0"]); } @end
另外如果你想检查WatchOS。
迅速
let watchOSVersion = WKInterfaceDevice.currentDevice().systemVersion print("WatchOS version: \(watchOSVersion)")
Objective-C的
NSString *watchOSVersion = [[WKInterfaceDevice currentDevice] systemVersion]; NSLog(@"WatchOS version: %@", watchOSVersion);
let osVersion = NSProcessInfo.processInfo().operatingSystemVersion let versionString = osVersion.majorVersion.description + "." + osVersion.minorVersion.description + "." + osVersion.patchVersion.description print(versionString)
获取当前版本的系统并将其拆分。 所以你可以得到主要和次要版本。
let sys_version = UIDevice.current.systemVersion let all_version = sys_version.components(separatedBy: ".") print("Major version : \(all_version[0])") print("Minor version : \(all_version[1])")
这里编写的大部分示例代码都会得到超出预期的结果。 例如,
func SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(version: String) -> Bool { return UIDevice.current.systemVersion.compare(version, options: .numeric) != ComparisonResult.orderedAscending }
在iOS“10.3”中,通过“10.3.0”版本的这个方法不会返回true。 这样的结果是没有意义的,它们必须被视为相同的版本。 为了得到准确的比较结果,我们必须考虑比较版本string中的所有数字组件。 此外,提供所有大写字母的全球方法并不是一个好的方法。 由于我们在SDK中使用的版本types是一个string,因此在String中扩展比较function是有意义的。
要比较系统版本,以下所有示例都应该可以工作。
XCTAssertTrue(UIDevice.current.systemVersion.isVersion(lessThan: "99.0.0")) XCTAssertTrue(UIDevice.current.systemVersion.isVersion(equalTo: UIDevice.current.systemVersion)) XCTAssertTrue(UIDevice.current.systemVersion.isVersion(greaterThan: "3.5.99")) XCTAssertTrue(UIDevice.current.systemVersion.isVersion(lessThanOrEqualTo: "10.3.0.0.0.0.0.0")) XCTAssertTrue(UIDevice.current.systemVersion.isVersion(greaterThanOrEqualTo: "10.3"))