Проверьте версию ОС в Swift?
Я пытаюсь проверить системную информацию в Swift. Я понял, что это может быть достигнуто с помощью кода:
var sysData:CMutablePointer<utsname> = nil
let retVal:CInt = uname(sysData)
У меня есть две проблемы с этим кодом:
- каким должно быть начальное значение sysData? Этот пример дает -1 в retVal, вероятно, потому, что sysData равен нулю.
- как я могу прочитать информацию из sysData?
19 ответов:
для iOS, попробуйте:
var systemVersion = UIDevice.current.systemVersionдля OS X, попробуйте:
var systemVersion = NSProcessInfo.processInfo().operatingSystemVersionесли вы просто хотите проверить, если пользователи работают по крайней мере определенную версию, вы также можете использовать следующую функцию Swift 2, которая работает на iOS и OS X:
if #available(iOS 9.0, *) { // use the feature only available in iOS 9 // for ex. UIStackView } else { // or use some work around }но не рекомендуется проверять версию ОС. Лучше проверить, доступна ли функция, которую вы хотите использовать, на устройстве, чем сравнивать номера версий. Для iOS, как уже упоминалось выше, вы следует проверить, если он отвечает на селектор; например.:
if (self.respondsToSelector(Selector("showViewController"))) { self.showViewController(vc, sender: self) } else { // some work around }
обновление:
Теперь вы должны использовать новый доступность проверки введено с Swift 2:
например, чтобы проверить iOS 9.0 или более поздней версии в compile использования времени это: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).floatValueEDIT: Просто нашел другой способ добиться этого:
let iOS8 = floor(NSFoundationVersionNumber) > floor(NSFoundationVersionNumber_iOS_7_1) let iOS7 = floor(NSFoundationVersionNumber) <= floor(NSFoundationVersionNumber_iOS_7_1)
Я сделал вспомогательные функции, которые были переданы из приведенной ниже ссылки в swift:
как мы можем программно определить, какая версия 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")
Swift 3.0
нам не нужно создавать расширение, так как
ProcessInfoдает нам информацию о версии. Вы можете увидеть пример кода для iOS, как показано ниже.let os = ProcessInfo().operatingSystemVersion switch (os.majorVersion, os.minorVersion, os.patchVersion) { 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: // this code will have already crashed on iOS 7, so >= iOS 10.0 println("iOS >= 10.0.0") }
Я сделал этот Синглтон для простого использования,создал и добавил этот код :
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 #available(iOS 9.0, *) { // } else { // }
Если вы используете Swift 2 и вы хотите проверить версию ОС, чтобы использовать определенный API, вы можете использовать новую функцию доступности:
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запрос.
Swift 4
func run() { let version = OperatingSystemVersion(majorVersion: 11, minorVersion: 0, patchVersion: 0) if ProcessInfo.processInfo.isOperatingSystemAtLeast(version) { runNewCode() } else { runLegacyCode() } } func runNewCode() { guard #available(iOS 11.0, *) else { fatalError() } // do new stuff } func runLegacyCode() { // do old stuff }
обновление для Swift 3.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 }
let Device = UIDevice.currentDevice() let iosVersion = NSString(string: Device.systemVersion).doubleValue let iOS8 = iosVersion >= 8 let iOS7 = iosVersion >= 7 && iosVersion < 8и как
if(iOS8) { } else { }
самый простой и простой способ проверить версию системы (и много других версий) в Swift 2 и выше:
if #available(iOS 9.0, *) { // check for iOS 9.0 and later }С
#availableвы можете проверить версии этих:iOS iOSApplicationExtension macOS macOSApplicationExtension watchOS watchOSApplicationExtension tvOS tvOSApplicationExtension swift
Мэтт Томпсон разделяет очень удобный способ
switch UIDevice.currentDevice().systemVersion.compare("8.0.0", options: NSStringCompareOptions.NumericSearch) { case .OrderedSame, .OrderedDescending: println("iOS >= 8.0") case .OrderedAscending: println("iOS < 8.0") }
проверка версии MacOS и iOS в Swift 3
IOS
код
extension UIDevice { var iOS: Double? { if UIDevice.current.systemName == "iOS" { if let iosVersion = UIDevice.current.systemVersion.toDouble { return iosVersion } } return nil } } extension String { var toDouble: Double? { if let iosVersion = Double(self) { return iosVersion } var arr = components(separatedBy: ".") if arr.count >= 1 { var integerPart = 0 var floatPart = 0 if let _integerPart = Int(arr[0]), !arr[0].isEmpty{ integerPart = _integerPart } if let _floatPart = Int(arr[1]), !arr[1].isEmpty{ floatPart = _floatPart } return Double("\(integerPart).\(floatPart)") } return nil } }образец преобразования строки версии
var stringVersion = "10.1.1" print(stringVersion.toDouble!) // print 10.1 stringVersion = ".5.35" print(stringVersion.toDouble!) // print 0.5 stringVersion = "..35" print(stringVersion.toDouble!) // print 0.0использование
if let iosVersion = UIDevice.current.iOS { if iosVersion >= 8.0 { print("current version: \(iosVersion)") } }
MacOS
код
extension ProcessInfo { var OS: Double? { let result = "\(ProcessInfo.processInfo.operatingSystemVersion.majorVersion).\(ProcessInfo.processInfo.operatingSystemVersion.minorVersion)" return Double(result) } }использование
// check os version if let systemVersion = ProcessInfo.processInfo.OS { if systemVersion >= 10.1 { print("current version: \(systemVersion)") } }
Примечание: доступно в 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 4.x
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! }П. С. Квиш ответ в переводе на Swift 4.x с переименованием функций, поскольку я специально использую этот фрагмент для приложения iOS.
основываясь на ответе Мэтта Томпсона, вот метод с соответствующими модульными тестами, который работает с Свифт и С on iOS 7 и выше (включая iOS 9 который больше не позволяет вам проверить NSFoundationNumber):
+ (BOOL) isAtLeastOSVersion:(NSString *)osVersion { switch ([[UIDevice currentDevice].systemVersion compare:osVersion options:NSNumericSearch]) { case NSOrderedSame: case NSOrderedDescending: return YES; default: return NO; } }.
@interface ANFakeCurrDevice : NSObject @property (nonatomic, strong) NSString *systemVersion; @end @implementation ANFakeCurrDevice @end @implementation MyHelperClassUnitTests - (void)setUp { [super setUp]; } - (void)tearDown { [super tearDown]; } - (void)test_isAtLeastOSVersion { id deviceMock = [OCMockObject niceMockForClass:[UIDevice class]]; ANFakeCurrDevice *fakeCurrDevice = [ANFakeCurrDevice new]; fakeCurrDevice.systemVersion = @"99.9.9"; [[[deviceMock stub] andReturn:fakeCurrDevice] currentDevice]; XCTAssertTrue([[UIDevice currentDevice].systemVersion isEqualToString:@"99.9.9"]); fakeCurrDevice.systemVersion = @"1.0.1"; XCTAssertTrue([ANConstants isAtLeastOSVersion:@"1"]); XCTAssertTrue([ANConstants isAtLeastOSVersion:@"1.0"]); XCTAssertTrue([ANConstants isAtLeastOSVersion:@"1.0.1"]); XCTAssertFalse([ANConstants isAtLeastOSVersion:@"1.0.2"]); XCTAssertFalse([ANConstants isAtLeastOSVersion:@"1.1.0"]); XCTAssertFalse([ANConstants isAtLeastOSVersion:@"2"]); XCTAssertFalse([ANConstants isAtLeastOSVersion:@"2.0"]); XCTAssertFalse([ANConstants isAtLeastOSVersion:@"2.0.0"]); XCTAssertFalse([ANConstants isAtLeastOSVersion:@"2.0.1"]); XCTAssertFalse([ANConstants isAtLeastOSVersion:@"2.1.0"]); fakeCurrDevice.systemVersion = @"8.4.0"; XCTAssertTrue([ANConstants isAtLeastOSVersion:@"7.0.1"]); XCTAssertTrue([ANConstants isAtLeastOSVersion:@"8"]); XCTAssertTrue([ANConstants isAtLeastOSVersion:@"8.4"]); XCTAssertFalse([ANConstants isAtLeastOSVersion:@"8.4.1"]); XCTAssertFalse([ANConstants isAtLeastOSVersion:@"8.4.2"]); XCTAssertFalse([ANConstants isAtLeastOSVersion:@"9.0"]); XCTAssertFalse([ANConstants isAtLeastOSVersion:@"9.0.1"]); XCTAssertFalse([ANConstants isAtLeastOSVersion:@"9.0.2"]); XCTAssertTrue([ANConstants isAtLeastOSVersion:@"8.4"] && ![ANConstants isAtLeastOSVersion:@"9.0"]); fakeCurrDevice.systemVersion = @"8.4.1"; XCTAssertTrue([ANConstants isAtLeastOSVersion:@"8.4"] && ![ANConstants isAtLeastOSVersion:@"9.0"]); } @end
также, если вы хотите проверить WatchOS.
Свифт
let watchOSVersion = WKInterfaceDevice.currentDevice().systemVersion print("WatchOS version: \(watchOSVersion)")С
NSString *watchOSVersion = [[WKInterfaceDevice currentDevice] systemVersion]; NSLog(@"WatchOS version: %@", watchOSVersion);
let osVersion = NSProcessInfo.processInfo().operatingSystemVersion let versionString = osVersion.majorVersion.description + "." + osVersion.minorVersion.description + "." + osVersion.patchVersion.description print(versionString)
получить текущую версию системы и расколоть его. Таким образом, вы можете получить основную и второстепенную версию.
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_GREATER_THAN_OR_EQUAL_TO(version: String) -> Bool { return UIDevice.current.systemVersion.compare(version, options: .numeric) != ComparisonResult.orderedAscending }этот метод не вернет true с переданной версией" 10.3.0 "в iOS"10.3". Такой результат не имеет смысла, и они должны рассматриваться как одна и та же версия. Чтобы получить точный результат сравнения, мы должны рассмотреть возможность сравнения всех числовых компонентов в строке версии. Кроме того, предоставление глобальных методов во всех заглавных буквах не является хорошим способом пойти. Как тип версии мы использование в нашем SDK-это строка, имеет смысл расширить функциональность сравнения в строке.
чтобы сравнить версию системы, все следующие примеры должны работать.
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
Comments