Wie kann ich wissen, unter welchem ​​Mac OS die App läuft?

8

Ich habe in einigen Projekten so etwas gesehen:

%Vor%

aber ich kann es jetzt nicht finden ...
Nehmen wir zum Beispiel an, wenn die App auf 10.8 ausgeführt wird, macht die App 1 Sache, wenn nicht die App andere Dinge tut. Was ist zu programmieren, um zu überprüfen, ob es auf 10.8 läuft?
Danke.

    
Pedro Vieira 15.06.2012, 17:01
quelle

7 Antworten

23

Sie stellen wahrscheinlich die falsche Frage. Außer in sehr seltenen Fällen sollte es Ihnen egal sein, welche Systemversion der Benutzer gerade ausführt. Stattdessen sollten Sie prüfen, ob die spezifische Sache, an der Sie interessiert sind, verfügbar ist.

Wenn Apple zum Beispiel eine MagicHologram-Klasse in Mac OS X 10.9 einführt, die Sie verwenden möchten, prüfen Sie nicht, ob der Benutzer Mac OS X 10.9 ausführt. Stattdessen überprüfen Sie, ob die MagicHologram-Klasse verfügbar ist. Wenn ja, können Sie es verwenden. Wenn nicht, ist es nicht verfügbar. Es spielt keine Rolle, warum. Vielleicht laufen sie 10.8. Aber vielleicht ist es fünf Jahre später, und Apple hat beschlossen, die MagicHologram-Klasse ganz fallen zu lassen.

(Denken Sie auch daran, dass Sie eine schwache Verbindung zu HologramKit herstellen müssen, der Bibliothek, die die MagicHologram-Klasse bereitstellt.)

Wenn Sie eine neue Methode für NSString einführen, prüfen Sie, ob NSString die neue Methode kennt, anstatt die Betriebssystemversion zu überprüfen.

Das heißt, NSApplication.h enthält eine externe Konstante namens NSAppKitVersionNumber . Sie können dies mit Konstanten wie NSAppKitVersionNumber10_7 vergleichen, die (wie zu beachten ist) Zahlen wie 1138 und nicht 10.7 sind. Es gibt nur wenige Orte, an denen dies angebracht ist, vor allem, wenn Klassen privat und nicht dokumentiert waren, aber große Änderungen erfahren haben, bevor sie dokumentiert wurden und Teil der öffentlichen Teile des SDK wurden. Außerdem könnte es hilfreich sein, wenn Sie einen spezifischen Fehler vermeiden möchten, der seither behoben wurde.

Zur Erinnerung:

  1. Ermitteln Sie einzelne Klassen und Methoden, die 99,44% Ihrer Fälle abdecken sollen.
  2. Verwenden Sie NSAppKitVersionNumber und NSAppKitVersionNumber10_7 , um die Fälle abzudecken, in denen die Klassen- oder Methodenerkennung Ihnen anzulasten wäre.
  3. Diese ersten beiden Punkte decken alle normalen Fälle ab. Du solltest nicht weiter gehen. Aber wenn Sie Verhalten basierend auf humane Version haben müssen, schauen Sie sich unten die Antwort von abarnert an. Es ist der gesundeste Weg, sie zu bekommen.
  4. Verwenden Sie nicht operatingSystemVersionString , was speziell als nicht sicher für das Parsen aufgelistet ist.

Referenzen / weitere Informationen:

  • SDK-Kompatibilitätshandbuch "Lesen Sie dieses Dokument, wenn Sie möchten Anwendung, um eine bestimmte Version oder mehrere Versionen von iOS oder Mac OS X als Ziel zu verwenden. "
    • Verwenden von SDK-basiert Entwicklung Beschreibt, wie schwach verknüpfte Klassen, Methoden und Funktionen verwendet werden, um das Ausführen auf mehreren Betriebssystemversionen zu unterstützen.
Steven Fisher 15.06.2012, 18:13
quelle
11

Ein schneller Weg, es zu tun ist:

%Vor%

Weitere hier .

Sie können alle in NSApplication.h verfügbaren Konstanten sehen, die Sie mit Open Quickly ... (Cmd-Shift O) in Xcode erreichen können.

Die Header-Dateien bieten für einige überraschend interessante Lektüre, wenn Sie so geneigt sind.

    
Monolo 15.06.2012 19:21
quelle
4

Wie andere oben gesagt haben (und ich würde Steven Fishers Antwort wählen), wollen Sie normalerweise nicht die Versionsnummer bekommen.

Und wenn Sie nur Vergleiche mit einer Hauptversion von OS X bis zur Version des aktuellen SDK durchführen müssen, das Sie verwenden, ist NSAppKitVersionNumber (wie in Monolos Antwort) der richtige Weg.

Wenn Sie die Versionsnummer aus irgendeinem Grund tatsächlich benötigen (z. B. zum Aufzeichnen von Analysen über Ihre Benutzer, damit Sie entscheiden können, wann Sie die Unterstützung von 10.6.0-10.6.5 beenden sollen), gehen Sie folgendermaßen vor:

%Vor%

Für 10.7.3 gibt dies majorVersion = 10, minorVersion = 7, bugFixVersion = 3.

In der 10.7-Dokumentation wurde der Absatz entfernt, der direkt Gestalt als die Möglichkeit zum Abrufen der Betriebssystemversion vorgeschlagen hat, aber noch immer nicht veraltet oder veraltet, und es gibt keine weiteren Vorschläge. Tatsächlich wird jeder andere Weg, um diese Informationen zu erhalten (syntaktisch - [NSProcessInfo operatingSystemVersionString], sysctlbyname auf "kern.osrelease" aufrufen und Darwin-Kernel-Version in OS X-Version konvertieren, etc.) irgendwo anders angegeben. Also, das ist der Weg, es zu tun, wenn du es wirklich willst.

Beachten Sie, dass die neue API möglicherweise nicht dauerhaft ist und in einer zukünftigen Version des Betriebssystems entfernt werden könnte, wie bereits in den Versionshinweisen zu System 6.0.4 von 1989 angegeben.

    
abarnert 15.06.2012 23:31
quelle
2

Sie können die aktuelle Version vom uname -r -Befehl (das ist eigentlich die Kernel-Version, obwohl es sich leicht auf Mac OS X-Versionen abbildet) vom sw_vers -Befehl erhalten, der Ihnen den Versionsnamen, die Version und den Build gibt Bezeichner oder von der Gestalt() -Funktion (in aktuellen Versionen von Mac OS X sowieso). Der sicherste Weg ist wahrscheinlich, die Ausgabe von sw_vers zu lesen, die sich in einem stabilen Format befindet, das leicht zu analysieren ist.

Beachten Sie, dass Sie wahrscheinlich nicht wissen möchten, auf welcher Version des Betriebssystems Sie sich befinden. Was Sie wahrscheinlich tun möchten, ist zu testen, ob eine bestimmte Funktion verfügbar ist. Dies können Sie durch schwach verlinkte Frameworks, durch schwache Klassenreferenzen oder durch Überprüfen, ob eine Klasse auf Selektoren reagiert, die für das Feature geeignet sind, an dem Sie interessiert sind.

    
user23743 15.06.2012 18:06
quelle
2

Wie Steven Fisher sagte, sollten Sie nicht nach der Systemversion suchen, sondern nach der Verfügbarkeit der Klasse oder Methode, die Sie verwenden möchten.

Die Überprüfung, ob eine bestimmte Klasse verfügbar ist, verwenden Sie

%Vor%

Um zu prüfen, ob eine bestimmte Methode verfügbar ist, verwenden Sie

%Vor%

Für die Methodenüberprüfung muss die Methode jedoch auf dem System verfügbar sein, auf dem Sie Ihre App erstellen, oder Sie erhalten einen Kompilierungsfehler.

    
codingFriend1 19.10.2012 08:03
quelle
0

Hier ist Code, wie ich es mache. Ich liebe es so, vor allem, weil ich nicht A) Auf eine NSTask oder B) Verlass Dich auf jede Datei-I / O, auf die viele Prozesse zugreifen können.

%Vor%

Viel Spaß!

    
Arvin 06.09.2012 02:13
quelle
-4

Sie können die Betriebssystemversion wie folgt erhalten:

%Vor%

Ausgabe:

Und ich sehe, Du willst nur Version bekommen. Es kann so gemacht werden: %Vor%

Ergebnis:

Und zum Überprüfen:

%Vor%     
Justin Boo 15.06.2012 17:55
quelle