Betriebssystemversion prüfen

From macwrench
Jump to navigation Jump to search

OS X Laufzeitumgebung

#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

#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

iOS Laufzeitumgebung

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

UIDevice

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

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

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

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

Base SDK

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
  Gefahrenzeichen 16.svg
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)

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

Siehe auch