Ios 在Swift中检查操作系统版本?
我正在用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
var sysData:CMutablePointer<utsname> = nil
let retVal:CInt = uname(sysData)
var sysData:CMutablePointer=nil
let retVal:CInt=uname(sysData)
我对此代码有两个问题:
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检查系统版本查询的第一个问题。基于马特·汤普森的答案,这里有一个方法,分别使用swift和Objective-c在iOS 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!
}