Swift에서 시스템 정보를 확인하려고합니다. 코드로 달성 할 수 있다고 생각했습니다.
var sysData:CMutablePointer<utsname> = nil
let retVal:CInt = uname(sysData)
이 코드에는 두 가지 문제가 있습니다.
- sysData의 초기 값은 무엇입니까? 이 예는 아마도 sysData가 nil이기 때문에 retVal에서 -1을 제공합니다.
- 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
쿼리에 대한 첫 번째 질문이므로이 답변을 작성했습니다 .