[ios] Swift에서 OS 버전을 확인 하시겠습니까?

Swift에서 시스템 정보를 확인하려고합니다. 코드로 달성 할 수 있다고 생각했습니다.

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

이 코드에는 두 가지 문제가 있습니다.

  1. sysData의 초기 값은 무엇입니까? 이 예는 아마도 sysData가 nil이기 때문에 retVal에서 -1을 제공합니다.
  2. 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
}

그러나 OS 버전을 확인하지 않는 것이 좋습니다. 사용하려는 기능이 버전 번호를 비교하는 것보다 장치에서 사용 가능한지 확인하는 것이 좋습니다.
위에서 언급 한대로 iOS의 경우 선택기에 응답하는지 확인해야합니다. 예 :

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을 확인하려는 경우 :

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)


답변

아래 링크에서 신속하게 전달 된 도우미 기능을 만들었습니다.

장치에서 실행중인 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")

스위프트 4.2

func SYSTEM_VERSION_EQUAL_TO(version: String) -> Bool {
    return UIDevice.current.systemVersion.compare(version, options: .numeric) == .orderedSame
}

func SYSTEM_VERSION_GREATER_THAN(version: String) -> Bool {
    return UIDevice.current.systemVersion.compare(version, options: .numeric) == .orderedDescending
}

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

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

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


답변

스위프트 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/


답변

스위프트 5

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
}


답변

이 싱글 톤을 간단하게 사용 하고 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

스위프트 2 편집 :

if #available(iOS 9.0, *) {
    // ?
} else {
    // ?
}


답변

Swift 2를 사용 중이고 특정 API를 사용하도록 OS 버전을 확인하려는 경우 새로운 가용성 기능을 사용할 수 있습니다.

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.
}

이 답변은 Google에서 swift 2 check system version쿼리에 대한 첫 번째 질문이므로이 답변을 작성했습니다 .