Chcem skontrolovať, či je verzia iOS
zariadenia vyššia ako 3.1.3
Skúšal som veci ako:
[[UIDevice currentDevice].systemVersion floatValue]
ale nefunguje to, chcem len:
if (version > 3.1.3) { }
Ako to môžem dosiahnuť?
/*
* System Versioning Preprocessor Macros
*/
#define SYSTEM_VERSION_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)
#define SYSTEM_VERSION_GREATER_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)
/*
* Usage
*/
if (SYSTEM_VERSION_LESS_THAN(@"4.0")) {
...
}
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"3.1.1")) {
...
}
Od verzie Swift 2.0 môžete v príkazoch if
alebo guard
použiť #available
na ochranu kódu, ktorý sa má spúšťať len na určitých systémoch.
```if #available(iOS 9, *) {}````
V Objective-C je potrebné skontrolovať verziu systému a vykonať porovnanie.
[[NSProcessInfo processInfo] operatingSystemVersion]
v systéme iOS 8 a vyššom.
Od verzie Xcode 9:
```if (@available(iOS 9, *)) {}````
V Objective-C a v zriedkavých prípadoch aj v Swifte je'lepšie nespoliehať sa na verziu operačného systému ako na údaj o možnostiach zariadenia alebo operačného systému. Zvyčajne existuje spoľahlivejší spôsob kontroly, či je daná funkcia alebo trieda dostupná.
Kontrola prítomnosti rozhraní API:
Pomocou funkcie NSClassFromString
môžete napríklad skontrolovať, či je na aktuálnom zariadení k dispozícii UIPopoverController
:
if (NSClassFromString(@"UIPopoverController")) {
// Do something
}
V prípade slabo prepojených tried je bezpečné poslať správu o triede priamo. Najmä to funguje pre rámce, ktoré nie sú'explicitne prepojené ako "Required". Pre chýbajúce triedy sa výraz vyhodnotí ako nil, čím sa podmienka nesplní:
if ([LAContext class]) {
// Do something
}
Niektoré triedy, ako napríklad CLLocationManager
a UIDevice
, poskytujú metódy na kontrolu možností zariadenia:
if ([CLLocationManager headingAvailable]) {
// Do something
}
Kontrola prítomnosti symbolov:
Veľmi zriedkavo musíte skontrolovať prítomnosť konštanty. Toto sa objavilo v systéme iOS 8 so zavedením funkcie UIApplicationOpenSettingsURLString
, ktorá sa používa na načítanie aplikácie Settings prostredníctvom funkcie -openURL:
. Pred systémom iOS 8 táto hodnota neexistovala. Odovzdanie nil tomuto API spôsobí haváriu, preto musíte dbať na to, aby ste najprv overili existenciu konštanty:
if (&UIApplicationOpenSettingsURLString != NULL) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
}
Porovnanie s verziou operačného systému:
Predpokladajme, že sa stretávate s relatívne zriedkavou potrebou skontrolovať verziu operačného systému. Pre projekty zamerané na iOS 8 a vyššie obsahuje NSProcessInfo
metódu na vykonávanie porovnávania verzií s menšou pravdepodobnosťou chyby:
- (BOOL)isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion)version
Projekty zamerané na staršie systémy môžu používať systemVersion
na UIDevice
. Apple ju používa vo svojom vzorovom kóde 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;
}
Ak sa z akéhokoľvek dôvodu rozhodnete, že systemVersion
je to, čo chcete, uistite sa, že s ním zaobchádzate ako s reťazcom, inak riskujete skrátenie čísla revízie záplaty (napr. 3.1.2 -> 3.1).
Skúste:
NSComparisonResult order = [[UIDevice currentDevice].systemVersion compare: @"3.1.3" options: NSNumericSearch];
if (order == NSOrderedSame || order == NSOrderedDescending) {
// OS version >= 3.1.3
} else {
// OS version < 3.1.3
}