2010-10-05 26 views
45

Esto es una continuación de mi última pregunta. Estoy usando 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 se desaconseja en iOS 4.0 y posterior. En su lugar, debe utilizar los métodos de animación basados ​​en bloques".Comprobar la versión de iOS en tiempo de ejecución?

Mi pregunta es Me encantaría usar animateWithDuration: animaciones: (disponible en iOS 4.0 y posterior) pero no desea 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é declaración usar?

+1

Compruebe este http://stackoverflow.com/questions/3339722/check-iphone-ios-hilo de la versión. –

Respuesta

51

En muchos casos no se necesita para comprobar la versión del IOS directamente, en vez de eso puedes verificar si un método particular está presente en tiempo de ejecución o no.

En su caso, usted puede hacer lo siguiente:

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

'[[Clase UIView] respondsToSelector: @selector (animateWithDuration: animations :)]' se puede escribir como '[UIView respondeSSelector: @selector (animateWithDuration: animations :)]' – user102008

+10

Odio las declaraciones generales. Hay casos de uso donde debe verificar la versión de iOS. ¡Me estoy enfrentando a un caso de uso así en este momento! –

+0

@JohnConnor, tiene razón en algunos casos es posible que deba verificar la versión de iOS, pero en general debe evitar eso si es posible. Solo curiosidad, ¿cuál es tu caso? – Vladimir

19

para ajustarse a 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
usted puede escribir función como esta (que SH Ould probablemente almacenar esta versión en algún lugar de calcularlo 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 usted puede utilizar esto como sigue:

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

Desalentado no es lo mismo como obsoletos.

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

+0

Ese es un muy buen punto, muy apreciado. – fuzzygoat

+0

Honestamente, si no necesita las características de los métodos basados ​​en bloques, no veo nada malo con el método anterior. – Jonny

+0

Sugiera que se haga un comentario o se agregue información útil para hacer de esto una respuesta. No estoy seguro de por qué ha votado ... –

59

más simple solución para cualquier persona que va a necesitar 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   

} 
+3

también podría haber usado la opción de comparación 'NSNumericSearch';) http://stackoverflow.com/a/1990854/429521 –

+0

Esto es genial porque a diferencia de la respuesta aceptada actual, necesito saber qué iOs versión que el usuario está operando porque ciertos caracteres Unicode funcionan de manera diferente antes de iOS6 (como/u200b que tiene una longitud de 0 en periOS6 pero una longitud de 1 en postiOS6) –

+3

También debe tenerse en cuenta que debe decir 'if (5 < = ...) 'de esta manera si salen con una versión más nueva de iOs (es decir, iOS6) ¡su aplicación aún soportará sus características! –

3

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

Aparte de conseguir la versión actual de iOS, también se 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.

1

En MonoTouch:

Para obtener la versión de mayor uso:

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

Para versión menor uso:

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

un poco más agradable y más eficiente adaptación 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 puede

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

HTH

+0

Ah, el viejo enfoque de CGPoint ¿eh? – Nestor

6

Puede utilizar la versión del marco de la Fundación para determinar la versión actual del sistema.

if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1){ 

//for earlier versions 

} else { 

//for iOS 7 

} 
2

poner esto en su archivo Prefix.pch

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

y luego se puede comprobar las versiones de iOS como:

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

¡Por supuesto si se puede usar la detección de características (y hace sentido para su caso de uso) debe hacer eso.

6

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

lo que sólo puede comprobarlo gusta:

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

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

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

o incluso incluir su cheque:

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

Entonces solo tiene que hacer:

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

XCode 7 añadió la sintaxis available haciendo de este relativamente más simple:

Swift:

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

XCode 9 también agregó esta sintaxis para Objective-C

Objetivo-C:

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