2017-08-23 1 views
7

In früheren iOS-Versionen I NSFoundationVersionNumber die iOS-Version zu erkennen, zur Erkennung:NSFoundationVersionNumber in iOS 11 - Wie iOS Version programmatisch

#define IS_IOS10orHIGHER (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_9_x_Max) 
#define IS_IOS9orHIGHER (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_8_3) 
#define IS_IOS8orHIGHER (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_7_1) 
#define IS_IOS7orHIGHER (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) 
#define IS_IOS6orHIGHER (floor(NSFoundationVersionNumber) >= NSFoundationVersionNumber_iOS_6_0) 
... 

Jetzt würde ich das gleiche für iOS 11 zu tun, aber ich war nicht in der Lage um die richtige NSFoundationVersionNumber zu finden. The docs zeigen NSFoundationVersionNumber_iOS_9_x_Max, um das Neueste zu sein.

Also, wie ist die korrekte NSFoundationVersionNumber zu erkennen, wenn iOS 11 verwendet wird?

Antwort

11

Eines der vorgesehenen Wege Systemversion zu bekommen, ist mit der Systemversion Eigenschaft UIDevice. https://developer.apple.com/documentation/uikit/uidevice/1620043-systemversion?language=objc

NSString * systemVersion = [[UIDevice currentDevice] systemVersion];

können Sie es auf diese Weise verwenden:

#define IS_IOS11orHIGHER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 11.0) 
+0

Eigentlich könnte es aufgrund der Fließkommaarithmetik zu einem Glitch kommen. '[[UIDevice currentDevice] systemVersion] floatValue]' ist '11.1999998' auf meinem System. Das Standard-Float-Rundungsproblem, also wenn ich nach 11.2 suchen würde, würde das scheitern. –

1

Apple NSProcessInfo

Apple stellt jetzt die NSOperatingSystemVersion struct in NSProcessInfo

Sie können es mit dem isOperatingSystemAtLeastVersion verwenden :, oder überprüfen Sie einfach die drei Felder genau wissen, welche Systemversion Ihrer App ausgeführt wird.

Es ist sowohl in obj c verfügbar und schnell

45

Wenn Sie mit Xcode 9 oder besser, können Sie das @available Attribut verwenden:

if (@available(iOS 11.0, *)) { 
    NSLog(@"newest"); 
} else { 
    NSLog(@"not newest"); 
} 

In Swift, ist es das gleiche, aber Dinkel #available anstelle von @available.

Der Grund dafür, dass dies eine bessere Methode als die anderen Methoden ist, liegt daran, dass der Compiler davon Kenntnis hat und Verfügbarkeitswarnungen entsprechend unterdrückt. Im obigen Beispiel können Sie APIs verwenden, die in iOS 11.0 innerhalb des Blocks if eingeführt wurden, ohne dass Sie davor gewarnt wurden, dass diese APIs für das Implementierungsziel Ihres Projekts nicht verfügbar sind.

+1

Ich mag diesen neuen Ansatz :) – Gomfucius

+0

Laut meinem Kommentar oben kann die angenommene Antwort einen Rundungsfehler aufgrund von Vergleichen mit Floats haben - immer eine Quelle subtiler Fehler. IMO das ist der viel bessere Weg. –

+0

Um klar zu sein, IMO diese Antwort von @CharlesSrstka ist korrekt und sollte die akzeptierte Antwort sein, nicht die, die einen Float-Vergleich der 'systemVersion' verwendet, da dies subtile Fehler verursachen kann. –