La risposta rapida ...
A partire da Swift 2.0, è possibile utilizzare #available
in un if
o guard
per proteggere il codice che dovrebbe essere eseguito solo su determinati sistemi.
if #available(iOS 9, *) {}
In Objective-C, è necessario verificare la versione del sistema ed eseguire un confronto.
[[NSProcessInfo processInfo] operatingSystemVersion]
in iOS 8 e versioni successive.
A partire da Xcode 9:
if (@available(iOS 9, *)) {}
La risposta completa ...
In Objective-C e Swift in rari casi, è meglio evitare di fare affidamento sulla versione del sistema operativo come indicazione delle funzionalità del dispositivo o del sistema operativo. Di solito esiste un metodo più affidabile per verificare se una particolare funzione o classe è disponibile.
Verifica della presenza di API:
Ad esempio, puoi verificare se UIPopoverController
è disponibile sul dispositivo corrente usando NSClassFromString
:
if (NSClassFromString(@"UIPopoverController")) {
// Do something
}
Per le classi debolmente collegate, è sicuro inviare un messaggio direttamente alla classe. In particolare, questo funziona per i framework che non sono esplicitamente collegati come "Richiesto". Per le classi mancanti, l'espressione restituisce zero, non riuscendo la condizione:
if ([LAContext class]) {
// Do something
}
Alcune classi, come CLLocationManager
e UIDevice
, forniscono metodi per verificare le funzionalità del dispositivo:
if ([CLLocationManager headingAvailable]) {
// Do something
}
Verifica della presenza di simboli:
Molto occasionalmente, è necessario verificare la presenza di una costante. Ciò è emerso in iOS 8 con l'introduzione di UIApplicationOpenSettingsURLString
, utilizzato per caricare l'app Impostazioni tramite -openURL:
. Il valore non esisteva prima di iOS 8. Il passaggio zero a questa API si arresterà in modo anomalo, quindi devi prima verificare l'esistenza della costante:
if (&UIApplicationOpenSettingsURLString != NULL) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
}
Confronto con la versione del sistema operativo:
Supponiamo che tu abbia di fronte la necessità relativamente rara di verificare la versione del sistema operativo. Per i progetti destinati a iOS 8 e versioni successive, NSProcessInfo
include un metodo per eseguire confronti di versioni con meno possibilità di errore:
- (BOOL)isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion)version
I progetti destinati a sistemi meno recenti possono essere utilizzati systemVersion
su UIDevice
. Apple lo utilizza nel proprio codice di esempio GLSprite .
// A system version of 3.1 or greater is required to use CADisplayLink. The NSTimer
// class is used as fallback when it isn't available.
NSString *reqSysVer = @"3.1";
NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending) {
displayLinkSupported = TRUE;
}
Se per qualsiasi motivo decidi che systemVersion
è quello che vuoi, assicurati di trattarlo come una stringa o rischi di troncare il numero di revisione della patch (es. 3.1.2 -> 3.1).