2009-12-27 10 views
8

¿Cómo se puede determinar y comparar (>, <, etc.) la versión actual del sistema operativo del iPhone en el que se ejecuta la aplicación? Hay un cierto error en 3.0 pero no en 3.1+, así que me gustaría poder omitir un poco de código si la versión actual del sistema operativo no es> = 3.1.¿Cómo determinar la versión actual del sistema operativo de iPhone en tiempo de ejecución y comparar cadenas de versión?

Esto tiene que ser en tiempo de ejecución no de compilación!

+0

Por curiosidad, ¿cuál es el error? –

+0

Es un error de datos centrales que causa un bloqueo cuando tanto 'setPropertiesToFetch:' como 'setFetchBatchSize:' se usan en una 'NSFetchRequest'. Esto es solo un problema en 3.0 ya que fue resuelto por 3.1. Aquí hay un enlace a la discusión: https://devforums.apple.com/message/101589#101589 –

Respuesta

13

¿Quiere decir determinar la versión del sistema operativo? El SDK está fijo en el tiempo de compilación, pero el sistema operativo puede cambiar. Para obtener la versión del sistema operativo, use [UIDevice currentDevice]. systemVersion. Para obtener la versión del SDK, creo que puedes usar __IPHONE_OS_VERSION_MIN_REQUIRED.

+0

¡Ah, sí, sí, la versión actual del sistema operativo! Como 'systemVersion' devuelve una cadena (@" 1.2 ", @" 3.1.2 "), ¿cómo se puede comparar y realizar comparaciones como < or >? –

+0

- [NSString intValue] o - [NSString floatValue] –

+0

No se puede probar eso en este momento, pero ¿cómo '' floatValue' manejará un valor como 3.2.1? Como no es un número de punto flotante válido? –

22

Por ejemplo, puede hacer algo como esto:

NSString *reqSysVer = @"3.1"; 
NSString *currSysVer = [[UIDevice currentDevice] systemVersion]; 

if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending) 
{ 
    //Do some clever stuff 
} 
+0

Esto tiene una deficiencia (¿error?) - si reqSysVer es 4.2 y la versión actual es 4.1, entonces la prueba tiene éxito y usted hace cosas inteligentes. El problema es que ese método simplemente prueba el primer número (escribí algunas pruebas para determinarlo). Vea mi sugerencia como el siguiente comentario. –

2

Una forma más fiable es hacer algo como esto:

static inline NSComparisonResult compareCurVersionTo(int major, int minor, int point) 
{ 
    NSUInteger testVers = major*10000 + minor*100 + point; 
    NSUInteger curSysNum = 0; 
    NSUInteger multi = 10000; 
    for(NSString *n in [[[UIDevice currentDevice] systemVersion] componentsSeparatedByString:@"."]) { 
     curSysNum += [n integerValue] * multi; 
     multi /= 100; 
    } 
    if(curSysNum < testVers) return NSOrderedAscending; 
    if(curSysNum > testVers) return NSOrderedDescending; 
    return NSOrderedSame; 
} 

Este maneja el error "Leopard", donde las versiones menores eran más de "9".

+1

Hola David, gracias por tu respuesta. Por favor, consulte el siguiente fragmento que proporciona la mejor manera de hacer este control: http://forr.st/~mOO Está oculto en los comentarios debajo de la respuesta aceptada. –

Cuestiones relacionadas