我正在用Swift检查系统信息。我发现,这可以通过代码来实现:

var sysData:CMutablePointer<utsname> = nil
let retVal:CInt = uname(sysData)

这段代码有两个问题:

sysData的初始值应该是什么?这个例子在retVal中给出-1可能是因为sysData为nil。 如何从sysData读取信息?


当前回答

斯威夫特5

我们不需要创建扩展,因为ProcessInfo给了我们版本信息。你可以在下面看到iOS的示例代码。

let os = ProcessInfo().operatingSystemVersion

switch (os.majorVersion, os.minorVersion, os.patchVersion) {
case (let x, _, _) where x < 8:
    print("iOS < 8.0.0")

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:
    print("iOS >= 10.0.0")
}

参考:http://nshipster.com/swift-system-version-checking/

其他回答

let Device = UIDevice.currentDevice()
let iosVersion = NSString(string: Device.systemVersion).doubleValue

let iOS8 = iosVersion >= 8
let iOS7 = iosVersion >= 7 && iosVersion < 8

检查为

if(iOS8)
{

}
else 
{
}  

注: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        }

更新: 现在你应该使用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
}    

或者带着守卫

guard #available(iOS 14, *) else {
    return
}

更多信息请看这个。

更新: 根据Allison的评论,我已经更新了答案,检查仍然是运行时,但编译器可以提前知道&可以显示更好的错误或建议,而你正在处理它。

其他检查方法:

如果你不知道确切的版本,但想检查iOS 9,10或11使用if:

let floatVersion = (UIDevice.current.systemVersion as NSString).floatValue

编辑: 只是找到了另一种实现这一目标的方法:

let iOS8 = floor(NSFoundationVersionNumber) > floor(NSFoundationVersionNumber_iOS_7_1)
let iOS7 = floor(NSFoundationVersionNumber) <= floor(NSFoundationVersionNumber_iOS_7_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。这样的结果是没有意义的,必须视为同一版本。为了得到准确的比较结果,必须考虑比较版本字符串中所有的数字分量。另外,以大写字母提供全局方法并不是一个好方法。因为我们在SDK中使用的版本类型是String,所以在String中扩展比较功能是有意义的。

要比较系统版本,以下所有示例都可以工作。

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"))

你可以在我的存储库中查看 https://github.com/DragonCherry/VersionCompare

马特·汤普森分享了一种非常简便的方法

switch UIDevice.currentDevice().systemVersion.compare("8.0.0", options: NSStringCompareOptions.NumericSearch) {
case .OrderedSame, .OrderedDescending:
    println("iOS >= 8.0")
case .OrderedAscending:
    println("iOS < 8.0")
}