Ich möchte überprüfen, ob die iOS
Version des Geräts größer ist, als 3.1.3
ich versucht habe:
[[UIDevice currentDevice].systemVersion floatValue]
aber es funktioniert nicht, ich will nur ein:
if (version > 3.1.3) { }
Wie kann ich das erreichen?
ios
objective-c
John
quelle
quelle
if #available(iOS 9, *) {}
in Swift. Starten von Xcode 9if (@available(iOS 11, *)) {}
in Ziel-c.Antworten:
Die schnelle Antwort…
Ab Swift 2.0 können Sie
#available
in einemif
oderguard
zum Schutz von Code verwenden, 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 in seltenen Fällen in Swift ist es besser, sich nicht auf die Betriebssystemversion als Hinweis auf Geräte- oder Betriebssystemfunktionen zu verlassen. Es gibt normalerweise eine zuverlässigere Methode, um zu überprüfen, ob ein bestimmtes Feature oder eine bestimmte Klasse verfügbar ist.
Überprüfen, ob APIs vorhanden sind:
Sie können beispielsweise überprüfen, ob
UIPopoverController
auf dem aktuellen Gerät Folgendes verfügbar istNSClassFromString
:Bei schwach verknüpften Klassen ist es sicher, die Klasse direkt zu benachrichtigen. Dies funktioniert insbesondere für Frameworks, die nicht explizit als "Erforderlich" verknüpft sind. Bei fehlenden Klassen wird der Ausdruck mit Null ausgewertet, wobei die Bedingung nicht erfüllt wird:
Einige Klassen, wie
CLLocationManager
undUIDevice
, bieten Methoden zum Überprüfen der Gerätefunktionen:Überprüfen, ob Symbole vorhanden sind:
Sehr gelegentlich müssen Sie prüfen, ob eine Konstante vorhanden ist. 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. Wenn Sie nil an diese API übergeben, stürzt dies ab. Überprüfen Sie daher zunächst, ob die Konstante vorhanden ist:Vergleich mit der Betriebssystemversion:
Nehmen wir an, Sie sehen sich mit der relativ seltenen Notwendigkeit konfrontiert, die Betriebssystemversion zu überprüfen.
NSProcessInfo
Enthält für Projekte mit iOS 8 und höher eine Methode zum Durchführen von Versionsvergleichen mit geringerer Fehlerwahrscheinlichkeit:Projekte, die auf ältere Systeme abzielen, können
systemVersion
auf verwendet werdenUIDevice
. Apple verwendet es in seinem GLSprite- Beispielcode.Wenn Sie aus irgendeinem Grund entscheiden, dass dies das
systemVersion
ist, was Sie möchten, stellen Sie sicher , dass Sie es als Zeichenfolge behandeln, da sonst die Patch-Versionsnummer abgeschnitten werden kann (z. B. 3.1.2 -> 3.1).quelle
-viewWillAppear
in einUISplitViewController
. Mein Hack besteht darin, festzustellen, ob <iOS 4.0, und es selbst in der Stammansicht an den Detail View Controller zu senden-didSelectRowAtIndexPath
.[@"10.0" compare:@"10" options:NSNumericSearch]
RückgabenNSOrderedDescending
, die möglicherweise überhaupt nicht beabsichtigt sind. (Ich könnte erwartenNSOrderedSame
.) Dies ist zumindest eine theoretische Möglichkeit.respondsToSelector
et al würden den Job nicht machen - müssen Versionen vergleichen.NSFoundationVersionNumber
und nur dann, wenn dies nicht möglich ist, die Systemversionen aktivierenUIDevice
.quelle
.0
Nummern verwendet. Gibt zum BeispielSYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0.0")
unter iOS 7.0 ein falsches Ergebnis.Wie in den offiziellen Apple-Dokumenten vorgeschlagen : Sie können die
NSFoundationVersionNumber
aus derNSObjCRuntime.h
Header-Datei verwenden.quelle
NSFoundationVersionNumber_iOS_6_1
existiert nicht im iOS 5 SDK.#ifndef NSFoundationVersionNumber_iOS_7_0 #define NSFoundationVersionNumber_iOS_7_0 1047.00 #endif
. Um solche Probleme zu vermeiden, habe ich das Makro SYSTEM_VERSION_LESS_THAN (v) von yasirmturkNSFoundationVersionNumber_iOS_8_0
in iOS 9 hinzufügen . Nur nachNSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1
Starten von Xcode 9 in Ziel-C :
Starten von Xcode 7 in Swift :
Für die Version können Sie MAJOR, MINOR oder PATCH angeben ( Definitionen siehe http://semver.org/ ). Beispiele:
iOS 11
undiOS 11.0
sind die gleiche minimale VersioniOS 10
,iOS 10.3
,iOS 10.3.1
Sind verschiedene Versionen minimalSie können Werte für jedes dieser Systeme eingeben:
iOS
,macOS
,watchOS
,tvOS
Ein echtes Fallbeispiel aus einem meiner Pods :
Dokumentation
quelle
if (...) {} else { ... }
guard
in Objective-C verwenden, anstatt den Block offen zu lassen und in derelse
Anweisung einzurücken ?if
Block gefolgt von einemelse
.if
Blöcke vermeiden .Dies wird verwendet, um in Xcode nach kompatiblen SDK-Versionen zu suchen. Dies ist der Fall, wenn Sie ein großes Team mit unterschiedlichen Xcode-Versionen oder mehrere Projekte haben, die unterschiedliche SDKs unterstützen, die denselben Code verwenden:
Was Sie wirklich wollen, ist die iOS-Version auf dem Gerät zu überprüfen. Das können Sie damit machen:
Schnelle Version:
Aktuelle Versionen von swift sollten Folgendes verwenden:
quelle
Versuchen:
quelle
Bevorzugter Ansatz
In Swift 2.0 hat Apple die Verfügbarkeitsprüfung mithilfe einer weitaus bequemeren Syntax hinzugefügt (Lesen Sie hier mehr ). Jetzt können Sie die Betriebssystemversion mit einer saubereren Syntax überprüfen:
Dies ist die bevorzugte Prüfung
respondsToSelector
usw. ( Was ist neu in Swift? ). Jetzt warnt Sie der Compiler immer, wenn Sie Ihren Code nicht richtig schützen.Pre Swift 2.0
Neu in iOS 8 ist
NSProcessInfo
eine bessere Überprüfung der semantischen Versionierung.Bereitstellung unter iOS 8 und höher
Dies würde Folgendes ergeben:
Bereitstellung unter iOS 7
Dies würde ergeben:
Lesen Sie mehr bei NSHipster .
quelle
Ich behalte diese immer in meiner Constants.h-Datei:
quelle
.pch
Datei Ihres XCode-ProjektsConstants.h
Datei, die in meinepch
Datei importiert wird.quelle
Mit der Versionsklasse , die im Projekt nv-ios-version enthalten ist (Apache License, Version 2.0), ist es einfach, die iOS-Version abzurufen und zu vergleichen. Ein Beispielcode unten gibt die iOS-Version aus und prüft, ob die Version größer oder gleich 6.0 ist.
Projektseite: nv-ios-Version
TakahikoKawasaki / nv-ios-Version
Blog: Abrufen und Vergleichen der iOS-Version zur Laufzeit mit der Versionsklasse
Abrufen und Vergleichen der iOS-Version zur Laufzeit mit der Versionsklasse
quelle
Neue Methode zum Überprüfen der Systemversion mit der schnellen SystemVersion Forget [[UIDevice currentDevice] systemVersion] und NSFoundationVersionNumber.
Wir können NSProcessInfo -isOperatingSystemAtLeastVersion verwenden
quelle
UIDevice + IOSVersion.h
UIDevice + IOSVersion.m
quelle
Im Allgemeinen ist es besser zu fragen, ob ein Objekt einen bestimmten Selektor ausführen kann, als eine Versionsnummer zu überprüfen, um zu entscheiden, ob sie vorhanden sein muss.
Wenn dies keine Option ist, müssen Sie hier etwas vorsichtig sein, da
[@"5.0" compare:@"5" options:NSNumericSearch]
RückgabenNSOrderedDescending
möglicherweise überhaupt nicht beabsichtigt sind. Ich könnteNSOrderedSame
hier erwarten . Dies ist zumindest ein theoretisches Anliegen, gegen das es sich meiner Meinung nach zu verteidigen lohnt.Erwägenswert ist auch die Möglichkeit einer fehlerhaften Versionseingabe, mit der nicht vernünftigerweise verglichen werden kann. Apple liefert die drei vordefinierte Konstanten definiert
NSOrderedAscending
,NSOrderedSame
undNSOrderedDescending
doch kann ich nach etwas , was einer Verwendung denken genanntNSOrderedUnordered
im Falle ich nicht vergleichen zwei Dinge können , und ich möchte einen Wert zurückgeben dies angibt.Darüber hinaus ist es nicht unmöglich, dass Apple eines Tages seine drei vordefinierten Konstanten erweitert, um eine Vielzahl von Rückgabewerten zu ermöglichen, was einen Vergleich
!= NSOrderedAscending
unklug macht.Betrachten Sie vor diesem Hintergrund den folgenden Code.
quelle
Wobei natürlich
NSFoundationVersionNumber_iOS_6_1
für die iOS-Version, die Sie überprüfen möchten, geändert werden muss. Was ich jetzt geschrieben habe, wird wahrscheinlich häufig verwendet, wenn getestet wird, ob auf einem Gerät iOS7 oder eine frühere Version ausgeführt wird.quelle
etwas spät zur Party, aber angesichts von iOS 8.0 könnte dies relevant sein:
wenn Sie vermeiden können, zu verwenden
[[UIDevice currentDevice] systemVersion]
Überprüfen Sie stattdessen, ob eine Methode / Klasse / was auch immer vorhanden ist.
Ich fand es nützlich für den Standortmanager, bei dem ich requestWhenInUseAuthorization für iOS 8.0 aufrufen muss, aber die Methode ist für iOS <8 nicht verfügbar
quelle
quelle
Ich weiß, dass dies eine alte Frage ist, aber jemand hätte die Makros zur Kompilierungszeit in erwähnen sollen
Availability.h
. Alle anderen Methoden hier sind Laufzeitlösungen und funktionieren nicht in einer Header-Datei, einer Klassenkategorie oder einer ivar-Definition.Verwenden Sie für diese Situationen
h / t diese Antwort
quelle
Fügen Sie dann eine if-Bedingung wie folgt hinzu: -
quelle
Es gibt Versionen wie 7.0 oder 6.0.3, daher können wir die Version zum Vergleich einfach in Zahlen umwandeln. Wenn die Version 7.0 entspricht, fügen Sie einfach eine weitere ".0" hinzu und nehmen Sie den numerischen Wert.
Für 6.0.0
für 7.0
quelle
6.1.10
. dann ergibt dieser Algorithmus6110 > 700
, was nicht korrekt ist.Versuchen Sie den folgenden Code:
quelle
Nur zum Abrufen des Zeichenfolgenwerts der Betriebssystemversion:
quelle
Als Variation der Yasimturks-Lösung habe ich eine Funktion und einige Enum-Werte anstelle von fünf Makros definiert. Ich finde es eleganter, aber das ist Geschmackssache.
Verwendungszweck:
.h Datei:
.m Datei:
Sie sollten das Präfix Ihrer App zu den Namen hinzufügen, insbesondere zum
Comparison
Typ.quelle
Verwenden der empfohlenen Methode ... Wenn die Header-Dateien keine Definition enthalten, können Sie die Versión jederzeit mit einem Gerät der gewünschten IOS-Versión auf der Konsole drucken lassen.
quelle
Lösung zum Überprüfen der iOS-Version in Swift
Nachteil dieser Lösung: Es ist einfach eine schlechte Praxis, anhand der Versionsnummern des Betriebssystems zu prüfen, wie auch immer Sie dies tun. Man sollte Abhängigkeiten niemals auf diese Weise fest codieren, sondern immer nach Funktionen, Fähigkeiten oder der Existenz einer Klasse suchen. Bedenken Sie; Apple veröffentlicht möglicherweise eine abwärtskompatible Version einer Klasse. Wenn dies der Fall wäre, würde der von Ihnen vorgeschlagene Code diese niemals verwenden, da Ihre Logik nach einer Versionsnummer des Betriebssystems sucht und NICHT nach der Existenz der Klasse.
( Quelle dieser Informationen )
Lösung zum Überprüfen der Klassenexistenz in Swift
Nicht verwenden,
if (NSClassFromString("UIAlertController") == nil)
da es auf dem iOS-Simulator mit iOS 7.1 und 8.2 ordnungsgemäß funktioniert. Wenn Sie jedoch auf einem realen Gerät mit iOS 7.1 testen, werden Sie leider feststellen, dass Sie den anderen Teil des Code-Snippets niemals durchlaufen werden.quelle
quelle
Eine allgemeinere Version in Obj-C ++ 11 (Sie könnten wahrscheinlich einige dieser Dinge durch die NSString / C-Funktionen ersetzen, aber dies ist weniger ausführlich. Dies gibt Ihnen zwei Mechanismen. SplitSystemVersion bietet Ihnen ein Array aller Teile, was nützlich ist, wenn Sie möchten nur die Hauptversion einschalten (z
switch([self splitSystemVersion][0]) {case 4: break; case 5: break; }
. B. ).quelle
Versuche dies
quelle
quelle
float versionToBeCompared = 3.1.3;
kann nicht einmal kompilieren.Schnelles Beispiel, das tatsächlich funktioniert:
Verwenden Sie NSProcessInfo nicht, da es unter 8.0 nicht funktioniert und daher bis 2016 so gut wie unbrauchbar ist
quelle
Hier ist eine schnelle Version:
Verwendungszweck:
quelle
struct iOSVersion { static let SYS_VERSION_FLOAT = (UIDevice.currentDevice().systemVersion as NSString).floatValue static let iOS7 = (iOSVersion.SYS_VERSION_FLOAT < 8.0 && iOSVersion.SYS_VERSION_FLOAT >= 7.0) static let iOS8 = (iOSVersion.SYS_VERSION_FLOAT >= 8.0 && iOSVersion.SYS_VERSION_FLOAT < 9.0) static let iOS9 = (iOSVersion.SYS_VERSION_FLOAT >= 9.0 && iOSVersion.SYS_VERSION_FLOAT < 10.0) }