Check macOS Version programmatically

From macwrench

macOS Version at build time[edit]

Please note that this solution allows you to check the macOS SDKs available in the current Xcode toolchain. The constants described here don't necessarily match the macOS Version your Xcode installation is running on. So it may very well be that there are higher version numbers available than the macOS Version you might expect (e.g. __MAC_11_0 and __MAC_11_1 are both available when running Xcode 12.4 on macOS Catalina (Version 10.15.7). But it's the next best thing to nothing I guess...

#ifdef MAC_OS_X_VERSION_10_15
    // do something
#endif
#ifdef MAC_OS_VERSION_12_0
    // do something
#endif
#ifdef __MAC_13_0
    // do something else
#endif
#ifdef __IPHONE_17_0
    // same thing for iOS (both iPhone and iPad)
#endif

Defined in AvailabilityVersions.h

iOS at runtime[edit]

Um für Codeweichen zur Laufzeit die aktuelle Systemversion abzugfragen, existieren verschiedene Möglichkeiten:

UIDevice[edit]

NSLog(@"current system version: %@",[[UIDevice currentDevice] systemVersion]);
if ([[[UIDevice currentDevice] systemVersion] compare:@"3.2" options:NSNumericSearch] != NSOrderedAscending) {
	// iOS 3.2 ooder neuer
}
if ([[[UIDevice currentDevice] systemVersion] compare:@"4.0" options:NSNumericSearch] != NSOrderedDescending) {
	// iOS 4.3 ooder älter
}

// alternativ, evtl. etwas übersichtlicher:
float version = [[[UIDevice currentDevice] systemVersion] floatValue];
if (version >= 3.2) {
	// iOS 3.2 oder neuer
}

System-Makros[edit]

Zum Versionsvergleich sind auch auch einige Makros verfügbar:

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"4.0") {
	// iOS 4.0 ooder älter
}

verfügbare Makros:

SYSTEM_VERSION_EQUAL_TO()
SYSTEM_VERSION_GREATER_THAN()
SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO()
SYSTEM_VERSION_LESS_THAN()
SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO()

Anhand bekannter Klassen[edit]

Um bestimmte iOS-Features zu nutzen, die erst ab (oder in) einer best. Version zur Verfügung stehen, bietet sich auch die direkte Nutzung dieser Klassen zur Versionsüberprüfung an:

Class playerClass = NSClassFromString(@"MPMoviePlayerViewController");
if(playerClass) {
	// iOS 3.2 oder neuer
} else {
	// älter als iOS 3.2
}

Class notificationClass = NSClassFromString(@"UILocalNotification");
if(notificationClass) {
	// iOS 4.0 oder neuer
} else {
	// älter als iOS 4.0
}

Projektumgebung[edit]

Für Abfragen zum Zeitpunkt des Übersetzens (in Xcode) existieren folgende Möglichkeiten:

Base SDK[edit]

In den verschiedenen iOS Versionen sind auch unterschiedliche Konstanten definiert, die dazu verwendet werden können (was allerdings weniger flexibel ist):

#ifdef __IPHONE_3_2
	// iOS 3.2 oder neuer
#endif
 
Diese Abfragen beziehen sich auf das aktuelle Base-SDK des Xcode Projektes und NICHT auf die tatsächlich zur Laufzeit verwendeten Betriebssystemversion! Wenn man also den Code mit Base SDK Version 5.0 übersetzt, werden immer alle Konstanten bis incl. _IPHONE_5_0 definiert sein - unabhängig davon, unter welcher SDK-Version die App anschließend läuft.
 

Deployment Target (Systemvoraussetzung)[edit]

Mit folgendem Code kann überprüft werden, welche die minimale, vom Xcode-Projekt unterstützte iOS Version ist (Deployment Target, wichtig v.a. für Bibliotheken und Frameworks):

#if __IPHONE_OS_VERSION_MIN_REQUIRED < 30200
	// älter als iOS 3.2
#else
	// iOS 3.2 oder neuer
#endif

Old and obsolete/deprecated[edit]

OS X Laufzeitumgebung[edit]

⚠️ Deprecated since OSX Version 10.8 (Mountain Lion)

#import <CoreServices/CoreServices.h>

...

SInt32 major, minor, bugfix;
Gestalt(gestaltSystemVersionMajor, &major);
Gestalt(gestaltSystemVersionMinor, &minor);
Gestalt(gestaltSystemVersionBugFix, &bugfix);

//NSString *versionString = [NSString stringWithFormat:@"%d.%d.%d", major, minor, bugfix];
NSString *versionString = [NSString stringWithFormat:@"%d.%d", major, minor];

float version = [versionString floatValue];
if(version < 10.8) {
    ...
}

OS X Build-Umgebung[edit]

⚠️ Nur verfügbar bis incl. macOS 10.15 (Catalina)

#ifndef MAC_OS_X_VERSION_10_7
// only executed when building on 10.6.x or older
#endif

#ifdef MAC_OS_X_VERSION_10_6
// only executed when building on 10.6.x or newer
#endif

Siehe auch[edit]