Frage Wie überprüfe ich die iOS-Version?


Ich möchte prüfen, ob das iOS Version des Geräts ist größer als 3.1.3 Ich habe Dinge versucht wie:

[[UIDevice currentDevice].systemVersion floatValue]

aber es funktioniert nicht, ich will nur ein:

if (version > 3.1.3) { }

Wie kann ich das erreichen?


772
2017-07-26 23:30


Ursprung


Antworten:


Die schnelle Antwort ...


Ab Swift 2.0 können Sie verwenden #available in einem (n if oder guard um Code zu schützen, der nur auf bestimmten Systemen ausgeführt werden sollte.

if #available(iOS 9, *) {}


In Objective-C müssen Sie die Systemversion überprüfen und einen Vergleich durchführen.

[[NSProcessInfo processInfo] operatingSystemVersion] in iOS 8 und höher.

Ab Xcode 9:

if (@available(iOS 9, *)) {}


Die vollständige Antwort ...

In Objective-C und Swift ist es in seltenen Fällen besser, sich nicht auf die Betriebssystemversion als Hinweis auf Geräte- oder Betriebssystemfunktionen zu verlassen. Es gibt normalerweise eine zuverlässigere Methode zur Überprüfung, ob eine bestimmte Funktion oder Klasse verfügbar ist.

Überprüfen auf das Vorhandensein von APIs:

Zum Beispiel können Sie überprüfen, ob UIPopoverController ist mit dem aktuellen Gerät verfügbar NSClassFromString:

if (NSClassFromString(@"UIPopoverController")) {
    // Do something
}

Für schwach verknüpfte Klassen ist es sicher, die Klasse direkt zu melden. Dies gilt insbesondere für Frameworks, die nicht explizit als "Erforderlich" verknüpft sind. Bei fehlenden Klassen wird der Ausdruck als null ausgewertet, wenn die Bedingung nicht erfüllt ist:

if ([LAContext class]) {
    // Do something
}

Einige Klassen, wie CLLocationManager und UIDevice, bieten Methoden zum Überprüfen von Gerätefunktionen:

if ([CLLocationManager headingAvailable]) {
    // Do something
}

Überprüfen auf das Vorhandensein von Symbolen:

Sehr gelegentlich müssen Sie auf das Vorhandensein einer Konstante prüfen. Dies kam in iOS 8 mit der Einführung von UIApplicationOpenSettingsURLString, verwendet, um Einstellungen App über zu laden -openURL:. Der Wert war vor iOS 8 nicht vorhanden. Das Übergeben von nil an diese API wird zum Absturz führen. Daher müssen Sie zuerst die Existenz der Konstante überprüfen:

if (&UIApplicationOpenSettingsURLString != NULL) {
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
}

Vergleich mit der Betriebssystemversion:

Nehmen wir an, Sie sind mit der relativ seltenen Notwendigkeit konfrontiert, die Betriebssystemversion zu überprüfen. Für Projekte mit iOS 8 und höher NSProcessInfo enthält eine Methode zum Ausführen von Versionsvergleichen mit geringer Fehlerwahrscheinlichkeit:

- (BOOL)isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion)version

Projekte, die auf ältere Systeme abzielen, können verwendet werden systemVersion auf UIDevice. Apple benutzt es in ihrem GLSprit Beispielcode.

// A system version of 3.1 or greater is required to use CADisplayLink. The NSTimer
// class is used as fallback when it isn't available.
NSString *reqSysVer = @"3.1";
NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending) {
    displayLinkSupported = TRUE;
}

Wenn Sie das aus irgendeinem Grund entscheiden systemVersion ist, was Sie wollen, stellen Sie sicher, dass Sie es als String behandeln oder Sie riskieren, die Patch-Revisionsnummer abzuschneiden (zB 3.1.2 -> 3.1).


906
2017-07-26 23:44



/*
 *  System Versioning Preprocessor Macros
 */ 

#define SYSTEM_VERSION_EQUAL_TO(v)                  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)
#define SYSTEM_VERSION_GREATER_THAN(v)              ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN(v)                 ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v)     ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)

/*
 *  Usage
 */ 

if (SYSTEM_VERSION_LESS_THAN(@"4.0")) {
    ...
}

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"3.1.1")) {
    ...
}

1039
2017-08-06 09:39



Wie von der offizielle Apple-Dokumentation: du kannst den ... benutzen NSFoundationVersionNumber, von dem NSObjCRuntime.h Header-Datei.

if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
    // here you go with iOS 7
}

245
2018-06-08 07:33



Starten von Xcode 9, in Ziel c:

if (@available(iOS 11, *)) {
    // iOS 11 (or newer) ObjC code
} else {
    // iOS 10 or older code
}

Starten von Xcode 7, in Schnell:

if #available(iOS 11, *) {
    // iOS 11 (or newer) Swift code
} else {
    // iOS 10 or older code
}

Für die Version können Sie den MAJOR, den MINOR oder den PATCH angeben (siehe http://semver.org/ für Definitionen). Beispiele:

  • iOS 11 und iOS 11.0 sind die gleiche minimale Version
  • iOS 10, iOS 10.3, iOS 10.3.1 sind verschiedene minimale Versionen

Sie können Werte für jedes dieser Systeme eingeben:

  • iOS, macOS, watchOS, tvOS

Reales Fallbeispiel aus eine meiner Hülsen:

if #available(iOS 10.0, tvOS 10.0, *) {
    // iOS 10+ and tvOS 10+ Swift code
} else {
    // iOS 9 and tvOS 9 older code
}

Dokumentation


63
2017-07-26 23:33



Versuchen:

NSComparisonResult order = [[UIDevice currentDevice].systemVersion compare: @"3.1.3" options: NSNumericSearch];
if (order == NSOrderedSame || order == NSOrderedDescending) {
    // OS version >= 3.1.3
} else {
    // OS version < 3.1.3
}

36
2017-10-07 11:33



Bevorzugter Ansatz

In Swift 2.0 hat Apple die Verfügbarkeitsprüfung mit einer viel bequemeren Syntax hinzugefügt (Lesen Sie mehr Hier). Jetzt können Sie die Betriebssystemversion mit einer saubereren Syntax überprüfen:

if #available(iOS 9, *) {
    // Then we are on iOS 9
} else {
    // iOS 8 or earlier
}

Dies ist die bevorzugte Überprüfung respondsToSelector etc (Was ist neu in Swift). Jetzt wird der Compiler Sie immer warnen, wenn Sie Ihren Code nicht richtig schützen.


Vor Swift 2.0

Neu in iOS 8 ist NSProcessInfo bessere semantische Versionskontrolle ermöglichen.

Bereitstellung unter iOS 8 und höher

Für minimale Bereitstellungsziele von iOS 8.0 oder darüber, verwenden NSProcessInfo operatingSystemVersion oder isOperatingSystemAtLeastVersion.

Dies würde folgendes ergeben:

let minimumVersion = NSOperatingSystemVersion(majorVersion: 8, minorVersion: 1, patchVersion: 2)
if NSProcessInfo().isOperatingSystemAtLeastVersion(minimumVersion) {
    //current version is >= (8.1.2)
} else {
    //current version is < (8.1.2)
}

Bereitstellung unter iOS 7

Für minimale Bereitstellungsziele von iOS 7.1 oder darunter, verwenden Sie vergleichen mit    NSStringCompareOptions.NumericSearch auf UIDevice systemVersion.

Dies würde ergeben:

let minimumVersionString = "3.1.3"
let versionComparison = UIDevice.currentDevice().systemVersion.compare(minimumVersionString, options: .NumericSearch)
switch versionComparison {
    case .OrderedSame, .OrderedDescending:
        //current version is >= (3.1.3)
        break
    case .OrderedAscending:
        //current version is < (3.1.3)
        fallthrough
    default:
        break;
}

Mehr lesen bei NSHipster.


34
2017-09-18 21:58



Dies wird verwendet, um nach einer kompatiblen SDK-Version in Xcode zu suchen. Dies ist der Fall, wenn Sie ein großes Team mit verschiedenen Xcode-Versionen oder mehrere Projekte haben, die verschiedene SDKs mit demselben Code unterstützen:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
  //programming in iOS 8+ SDK here
#else
  //programming in lower than iOS 8 here   
#endif

Was Sie wirklich wollen, ist die iOS-Version auf dem Gerät zu überprüfen. Das kannst du damit machen:

if ([[[UIDevice currentDevice] systemVersion] floatValue] < 8.0) {
  //older than iOS 8 code here
} else {
  //iOS 8 specific code here
}

Schnelle Version:

if let version = Float(UIDevice.current.systemVersion), version < 9.3 {
    //add lower than 9.3 code here
} else {
    //add 9.3 and above code here
}

34
2017-07-27 06:32