Verifica la versione di iOS in fase di runtime?

Questa è una sorta di seguito dalla mia ultima domanda. Sto usando beginAnimations:context: per impostare un blocco di animazione per animare alcuni UITextLabels. Tuttavia, ho notato nei documenti che si dice: “L’uso di questo metodo è sconsigliato in iOS 4.0 e versioni successive, dovresti invece utilizzare i metodi di animazione basati su blocchi”.

La mia domanda è che mi piacerebbe usare animateWithDuration: animazioni: (disponibile in iOS 4.0 e versioni successive) ma non voglio escludere persone usando iOS 3.0. C’è un modo per verificare la versione iOS di un dispositivo in fase di runtime in modo che io possa prendere una decisione su quale affermazione usare?

In molti casi non è necessario controllare direttamente la versione di iOS, invece di controllare se un determinato metodo è presente in runtime o meno.

Nel tuo caso puoi fare quanto segue:

 if ([[UIView class] respondsToSelector:@selector(animateWithDuration:animations:)]){ // animate using blocks } else { // animate the "old way" } 

Soluzione più semplice per chiunque abbia bisogno di aiuto in futuro:

 NSArray *versionCompatibility = [[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."]; if ( 5 == [[versionCompatibility objectAtIndex:0] intValue] ) { /// iOS5 is installed // Put iOS-5 code here } else { /// iOS4 is installed // Put iOS-4 code here } 

per conformarsi alla versione specificata nel sistema definisce

// # define __IPHONE_2_0 20000
// # define __IPHONE_2_1 20100
// # define __IPHONE_2_2 20200
// # define __IPHONE_3_0 30000
// # define __IPHONE_3_1 30100
// # define __IPHONE_3_2 30200
// # define __IPHONE_4_0 40000
Puoi scrivere una funzione come questa (dovresti probabilmente memorizzare questa versione da qualche parte piuttosto che calcolarla ogni volta):

 + (NSInteger) getSystemVersionAsAnInteger{ int index = 0; NSInteger version = 0; NSArray* digits = [[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."]; NSEnumerator* enumer = [digits objectEnumerator]; NSString* number; while (number = [enumer nextObject]) { if (index>2) { break; } NSInteger multipler = powf(100, 2-index); version += [number intValue]*multipler; index++; } return version; } 

Quindi puoi usare questo come segue:

 if([Toolbox getSystemVersionAsAnInteger] >= __IPHONE_4_0) { //blocks } else { //oldstyle } 

Scoraggiato non è lo stesso di deprecato.

Se hai bisogno di supportare versioni precedenti di iOS che non hanno i metodi basati sui blocchi, non c’è niente di sbagliato nell’usare i metodi più vecchi (a patto che non siano stati rimossi, ovviamente).

È ansible utilizzare la versione del framework Foundation per determinare la versione corrente del sistema.

 if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1){ //for earlier versions } else { //for iOS 7 } 

La maggior parte di queste soluzioni qui sono così esagerate. Tutto ciò che devi fare è [[UIDevice currentDevice].systemVersion intValue] . Questo rimuove automaticamente il decimale, quindi non è necessario dividere la stringa.

Quindi puoi semplicemente controllare come:

 if ([[UIDevice currentDevice].systemVersion intValue] >= 8) { // iOS 8.0 and above } else { // Anything less than iOS 8.0 } 

Puoi anche definire una macro con questo codice:

 #define IOS_VERSION [[UIDevice currentDevice].systemVersion intValue]; 

o includi anche il tuo assegno:

 #define IOS_8PLUS ([[UIDevice currentDevice].systemVersion intValue] >= 8) 

Quindi devi solo fare:

 if (IOS_8PLUS) { // iOS 8.0 and above } else { // Anything less than iOS 8.0 } 

Per i miei scopi ho scritto una piccola libreria che astrae i richiami C sottostanti e presenta un’interfaccia Objective-C.

 GBDeviceDetails deviceDetails = [GBDeviceInfo deviceDetails]; if (deviceDetails.iOSVersion >= 6) { NSLog(@"It's running at least iOS 6"); //It's running at least iOS 6 } 

Oltre a ottenere l’attuale versione iOS, rileva anche l’hardware del dispositivo sottostante e ottiene informazioni sulla dimensione dello schermo; tutto a runtime.

È su github: GBDeviceInfo . Autorizzato con Apache 2.

XCode 7 ha aggiunto la syntax available rendendo questo relativamente più semplice:

Swift:

 if #available(iOS 9, *) { // iOS 9 only code } else { // Fallback on earlier versions } 

XCode 9 ha anche aggiunto questa syntax a Objective-C

Objective-C:

 if (@available(iOS 9.0, *)) { // iOS 9 only code } else { // Fallback on earlier versions } 

Metti questo nel tuo file Prefix.pch

 #define IOS_VERSION [[[[[UIDevice currentDevice] systemVersion] componentsSeparatedByString:@"."] firstObject] intValue] 

E poi puoi controllare le versioni iOS come:

 if(IOS_VERSION == 8) { // Hello 8! } else { // Hello some other version! } 

Ovviamente, se puoi utilizzare il rilevamento delle funzioni (e ha senso per il tuo caso d’uso) dovresti farlo.

In MonoTouch:

Per ottenere la versione principale utilizzare:

 UIDevice.CurrentDevice.SystemVersion.Split('.')[0] 

Per versioni minori, utilizzare:

 UIDevice.CurrentDevice.SystemVersion.Split('.')[1] 

Un adattamento un po ‘più bello ed efficiente alle soluzioni di cui sopra:

 -(CGPoint)getOsVersion { static CGPoint rc = {-1,-1}; if (rc.x == -1) { NSArray *versionCompatibility = [[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."]; rc.x = [versionCompatibility[0] intValue]; rc.y = [versionCompatibility[1] intValue]; } return rc; } 

ora puoi

 if ([self getOsVersion].x < 7) { } 

HTH