Ios 在Swift中检查操作系统版本?

Ios 在Swift中检查操作系统版本?,ios,macos,swift,Ios,Macos,Swift,我正在用Swift检查系统信息。我发现,这可以通过代码实现: var sysData:CMutablePointer<utsname> = nil let retVal:CInt = uname(sysData) var sysData:CMutablePointer=nil let retVal:CInt=uname(sysData) 我对此代码有两个问题: sysData的初始值应该是多少?这个例子在retVal中给出了-1,可能是因为sysData是nil 如何从sysDa

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

var sysData:CMutablePointer<utsname> = nil
let retVal:CInt = uname(sysData)
var sysData:CMutablePointer=nil
let retVal:CInt=uname(sysData)
我对此代码有两个问题:

  • sysData的初始值应该是多少?这个例子在retVal中给出了-1,可能是因为sysData是nil
  • 如何从sysData读取信息
  • 对于iOS,请尝试:

    var systemVersion = UIDevice.current.systemVersion
    
    对于OS X,请尝试:

    var systemVersion = NSProcessInfo.processInfo().operatingSystemVersion
    
    如果您只想检查用户是否运行了至少一个特定版本,还可以使用以下适用于iOS和OS X的Swift 2功能:

    if #available(iOS 9.0, *) {
        // use the feature only available in iOS 9
        // for ex. UIStackView
    } else {
        // or use some work around
    }
    
    if #available(iOS 9.0, *) {
        // 
    let Device = UIDevice.currentDevice()
    let iosVersion = NSString(string: Device.systemVersion).doubleValue
    
    let iOS8 = iosVersion >= 8
    let iOS7 = iosVersion >= 7 && iosVersion < 8
    
    但不建议检查操作系统版本。与比较版本号相比,最好检查您要使用的功能是否在设备上可用。 对于iOS,如上所述,您应该检查它是否响应选择器; 例如:


    我制作了从以下链接转移到swift的助手功能:

    它可以这样使用:

    SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO("7.0")
    
    Swift 4.2
    func系统版本等于(版本:字符串)->Bool{
    返回UIDevice.current.systemVersion.compare(版本,选项:。数值)=.orderedSame
    }
    func系统版本大于(版本:字符串)->Bool{
    返回UIDevice.current.systemVersion.compare(版本,选项:。数值)=.orderedDescending
    }
    func系统版本大于或等于(版本:字符串)->Bool{
    返回UIDevice.current.systemVersion.compare(版本,选项:。数值)!=.orderedAscending
    }
    func系统版本小于(版本:字符串)->Bool{
    返回UIDevice.current.systemVersion.compare(版本,选项:。数值)=.orderedAscending
    }
    func系统版本小于等于(版本:字符串)->Bool{
    返回UIDevice.current.systemVersion.compare(版本,选项:。数值)!=.orderedDescending
    }
    
    更新:
    现在,您应该使用Swift 2引入的新可用性检查:
    e、 g.要在编译时检查iOS 9.0或更高版本,请使用以下命令:

    if #available(iOS 9.0, *) {
        // use UIStackView
    } else {
        // show sad face emoji
    }
    
    或者可以与整个方法或类一起使用

    有关更多信息,请参阅

    运行时检查:

    如果您不想要确切的版本,但想使用以下条件检查iOS 9、10或11:

    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)
    
    让iOS8=floor(NSFoundationVersionNumber)>floor(NSFoundationVersionNumber\u iOS\u 7\u 1)
    
    让iOS7=floor(NSFoundationVersionNumber)注意:在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        }
    

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

    switch UIDevice.currentDevice().systemVersion.compare("8.0.0", options: NSStringCompareOptions.NumericSearch) {
    case .OrderedSame, .OrderedDescending:
        println("iOS >= 8.0")
    case .OrderedAscending:
        println("iOS < 8.0")
    }
    
    切换UIDevice.currentDevice().systemVersion.compare(“8.0.0”,选项:NSStringCompareOptions.NumericSearch){
    case.OrderedSame、.OrderedDescending:
    println(“iOS>=8.0”)
    案例。订购气味:
    println(“iOS<8.0”)
    }
    
    我制作此单例是为了简单使用,创建了一个
    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#可用(iOS 9.0,*){
    
    //如果您使用的是Swift 2,并且希望检查操作系统版本以使用特定API,则可以使用新的可用性功能:

    + (BOOL) isAtLeastOSVersion:(NSString *)osVersion
    {
        switch ([[UIDevice currentDevice].systemVersion compare:osVersion options:NSNumericSearch]) {
            case NSOrderedSame:
            case NSOrderedDescending:
                return YES;
            default:
                return NO;
        }
    }  
    

    我写这个答案是因为这是谷歌关于
    swift 2检查系统版本查询的第一个问题。

    基于马特·汤普森的答案,这里有一个方法,分别使用swiftObjective-ciOS 7及更高版本上进行单元测试(包括不再让您查看NSFoundation编号的iOS 9):


    如果您想查看WatchOS,也可以

    迅捷的

    目标-C

    let osVersion = NSProcessInfo.processInfo().operatingSystemVersion
    let versionString = osVersion.majorVersion.description + "." + osVersion.minorVersion.description + "." + osVersion.patchVersion.description
    print(versionString)
    
    细节
    • 代码10.2.1(10E1001),Swift 5
    链接

    解决方案 斯威夫特5 我们不需要创建扩展,因为
    ProcessInfo
    提供了版本信息。您可以看到iOS的示例代码,如下所示

    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])")
    
    让os=ProcessInfo().操作系统版本
    交换机(os.majorVersion、os.minorVersion、os.patchVersion){
    情形(设x,,x),其中x<8:
    打印(“iOS<8.0.0”)
    案例(8,0,0):
    打印(“iOS>=8.0.0,<8.1.0”)
    案例(8,uu,uu):
    打印(“iOS>=8.1.0,<9.0”)
    案例(9,uu,uu):
    打印(“iOS>=9.0.0”)
    违约:
    打印(“iOS>=10.0.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
    }
    
    Swift 3.0的更新+

    if #available(iOS 9.0, *) { // check for iOS 9.0 and later
    
    }
    

    在Swift 2及更高版本中检查系统版本(以及许多其他版本)的最简单方法是:

    iOS
    iOSApplicationExtension
    macOS
    macOSApplicationExtension
    watchOS
    watchOSApplicationExtension
    tvOS
    tvOSApplicationExtension
    swift
    
    此外,使用可用的
    #
    ,您可以检查以下版本:

    func SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(version: String) -> Bool {
    return UIDevice.current.systemVersion.compare(version, options: .numeric) != ComparisonResult.orderedAscending
    }
    

    这里编写的大多数示例代码都会得到额外零版本的意外结果。例如

    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"))
    
    在iOS“10.3”中通过版本“10.3.0”时,此方法不会返回true为了获得准确的比较结果,我们必须考虑比较版本字符串中的所有数字分量。此外,在所有大写字母中提供全局方法不是一个好方法。因为在SDK中使用的版本类型是字符串,扩展C是有意义的。字符串中的比较功能

    要比较系统版本,以下所有示例都可以使用

    func run() {
        let version = OperatingSystemVersion(majorVersion: 13, minorVersion: 0, patchVersion: 0)
        if ProcessInfo.processInfo.isOperatingSystemAtLeast(version) {
            runNewCode()
        } else {
            runLegacyCode()
        }
    }
    
    func runNewCode() {
        guard #available(iOS 13.0, *) else {
            fatalError()
        }
        // do new stuff
    }
    
    func runLegacyCode() {
        // do old stuff
    }
    
    您可以在我的存储库中查看

    Swift 5 Swift 4.x

    if iOS_VERSION_GREATER_THAN_OR_EQUAL_TO(version: "11.0") {
        //Do something!
    }
    
    用法:


    p.S.KVISH answer将函数重命名为Swift 4.x,因为我专门将此代码片段用于iOS应用程序。

    您确实意识到,实际的方法非常简短,我只是添加了单元测试代码来说明和证明它的工作原理,对吗?很抱歉,我没能一眼就意识到它是XCTest。虽然这对于目标c是正确的,但在swift中有一种更好的方法。这里概述了…我可以看到直接检查操作系统版本(而不是检查特定功能)的一个用途是收集有关操作系统版本发行版的数据
    extension OperatingSystemVersion {
        func getFullVersion(separator: String = ".") -> String {
            return "\(majorVersion)\(separator)\(minorVersion)\(separator)\(patchVersion)"
        }
    }
    
    let os = ProcessInfo().operatingSystemVersion
    print(os.majorVersion)          // 12
    print(os.minorVersion)          // 2
    print(os.patchVersion)          // 0
    print(os.getFullVersion())      // 12.2.0
    
    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")
    }
    
    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_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
    }
    
    if #available(iOS 9.0, *) { // check for iOS 9.0 and later
    
    }
    
    iOS
    iOSApplicationExtension
    macOS
    macOSApplicationExtension
    watchOS
    watchOSApplicationExtension
    tvOS
    tvOSApplicationExtension
    swift
    
    func SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(version: String) -> Bool {
    return UIDevice.current.systemVersion.compare(version, options: .numeric) != ComparisonResult.orderedAscending
    }
    
    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"))
    
    func run() {
        let version = OperatingSystemVersion(majorVersion: 13, minorVersion: 0, patchVersion: 0)
        if ProcessInfo.processInfo.isOperatingSystemAtLeast(version) {
            runNewCode()
        } else {
            runLegacyCode()
        }
    }
    
    func runNewCode() {
        guard #available(iOS 13.0, *) else {
            fatalError()
        }
        // do new stuff
    }
    
    func runLegacyCode() {
        // do old stuff
    }
    
    func iOS_VERSION_EQUAL_TO(version: String) -> Bool {
        return UIDevice.current.systemVersion.compare(version, options: NSString.CompareOptions.numeric) == ComparisonResult.orderedSame
    }
    
    func iOS_VERSION_GREATER_THAN(version: String) -> Bool {
        return UIDevice.current.systemVersion.compare(version, options: NSString.CompareOptions.numeric) == ComparisonResult.orderedDescending
    }
    
    func iOS_VERSION_GREATER_THAN_OR_EQUAL_TO(version: String) -> Bool {
        return UIDevice.current.systemVersion.compare(version, options: NSString.CompareOptions.numeric) != ComparisonResult.orderedAscending
    }
    
    func iOS_VERSION_LESS_THAN(version: String) -> Bool {
        return UIDevice.current.systemVersion.compare(version, options: NSString.CompareOptions.numeric) == ComparisonResult.orderedAscending
    }
    
    func iOS_VERSION_LESS_THAN_OR_EQUAL_TO(version: String) -> Bool {
        return UIDevice.current.systemVersion.compare(version, options: NSString.CompareOptions.numeric) != ComparisonResult.orderedDescending
    }
    
    if iOS_VERSION_GREATER_THAN_OR_EQUAL_TO(version: "11.0") {
        //Do something!
    }