Verifique la versión de iOS en tiempo de ejecución?

Esto es una continuación de mi última pregunta. Estoy utilizando beginAnimations:context: para configurar un bloque de animación para animar algunas UITextLabels. Sin embargo, me di cuenta en los documentos que dice: “El uso de este método no se recomienda en iOS 4.0 y posterior. En su lugar, debe usar los métodos de animación basados ​​en bloques”.

Mi pregunta es si me encantaría usar animateWithDuration: animaciones: (disponible en iOS 4.0 y posterior) pero no quiero excluir a las personas que usan iOS 3.0. ¿Hay alguna forma de verificar la versión de iOS de un dispositivo en tiempo de ejecución para poder tomar una decisión sobre qué statement usar?

En muchos casos, no es necesario que compruebe la versión de iOS directamente, en lugar de eso, puede verificar si un método particular está presente en tiempo de ejecución o no.

En tu caso, puedes hacer lo siguiente:

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

Solución más simple para cualquier persona que necesite ayuda en el 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 } 

para cumplir con la versión especificada en el sistema define

// # 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
Puede escribir una función como esta (probablemente debería almacenar esta versión en algún lugar en lugar de calcularla cada vez):

 + (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; } 

Entonces puedes usar esto de la siguiente manera:

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

Desanimado no es lo mismo que obsoleto.

Si necesita admitir versiones anteriores de iOS que no tienen los métodos basados ​​en bloques, no hay nada de malo con el uso de los métodos anteriores (siempre que no se hayan eliminado, por supuesto).

Puede usar la versión del marco de Foundation para determinar la versión actual del sistema.

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

La mayoría de estas soluciones aquí son tan excesivas. Todo lo que necesita hacer es [[UIDevice currentDevice].systemVersion intValue] . Esto elimina automáticamente el decimal, por lo que no hay necesidad de dividir la cadena.

Entonces puedes verificarlo así:

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

También puedes definir una macro con este código:

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

o incluso incluya su cheque:

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

Entonces solo necesitas hacer:

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

Para mis propósitos, he escrito una pequeña biblioteca que abstrae las llamadas C subyacentes y presenta una interfaz 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 } 

Además de obtener la versión actual de iOS, también detecta el hardware del dispositivo subyacente y obtiene información sobre el tamaño de la pantalla; todo en tiempo de ejecución

Está en github: GBDeviceInfo . Licencia bajo Apache 2.

XCode 7 agregó la syntax available haciendo esto relativamente más simple:

Rápido:

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

XCode 9 también agregó esta syntax a Objective-C

C objective:

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

Pon esto en tu archivo Prefix.pch

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

Y luego puedes verificar las versiones de iOS como:

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

Por supuesto, si puede usar la detección de características (y tiene sentido para su caso de uso) debería hacerlo.

En MonoTouch:

Para obtener la versión principal, use:

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

Para una versión menor, use:

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

Una adaptación un poco mejor y más eficiente a las soluciones anteriores:

 -(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; } 

ahora usted puede

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

HTH