Pregunta ¿Cómo verificar la versión de iOS?


Quiero verificar si el iOS versión del dispositivo es mayor que 3.1.3 Intenté cosas como:

[[UIDevice currentDevice].systemVersion floatValue]

pero no funciona, solo quiero un:

if (version > 3.1.3) { }

¿Cómo puedo conseguir esto?


772
2017-07-26 23:30


origen


Respuestas:


La respuesta rápida ...


A partir de Swift 2.0, puede usar #available en una if o guard para proteger el código que solo debería ejecutarse en ciertos sistemas.

if #available(iOS 9, *) {}


En Objective-C, debe verificar la versión del sistema y realizar una comparación.

[[NSProcessInfo processInfo] operatingSystemVersion] en iOS 8 y superior.

A partir de Xcode 9:

if (@available(iOS 9, *)) {}


La respuesta completa ...

En Objective-C y Swift en casos excepcionales, es mejor evitar confiar en la versión del sistema operativo como una indicación de las capacidades del dispositivo o del sistema operativo. Por lo general, hay un método más confiable para verificar si una característica o clase en particular está disponible.

Comprobando la presencia de API:

Por ejemplo, puedes verificar si UIPopoverController está disponible en el dispositivo actual usando NSClassFromString:

if (NSClassFromString(@"UIPopoverController")) {
    // Do something
}

Para las clases débilmente vinculadas, es seguro enviar mensajes a la clase, directamente. En particular, esto funciona para los marcos que no están explícitamente vinculados como "Requerido". Para las clases faltantes, la expresión se evalúa como nula, fallando la condición:

if ([LAContext class]) {
    // Do something
}

Algunas clases, como CLLocationManager y UIDevice, proporcione métodos para verificar las capacidades del dispositivo:

if ([CLLocationManager headingAvailable]) {
    // Do something
}

Comprobando la presencia de símbolos:

Muy ocasionalmente, debes verificar la presencia de una constante. Esto surgió en iOS 8 con la introducción de UIApplicationOpenSettingsURLString, utilizado para cargar la aplicación de configuración a través de -openURL:. El valor no existía antes de iOS 8. Pasarle nada a esta API se bloqueará, por lo que debe asegurarse de verificar primero la existencia de la constante:

if (&UIApplicationOpenSettingsURLString != NULL) {
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
}

Comparando con la versión del sistema operativo:

Supongamos que se enfrenta con la necesidad relativamente rara de verificar la versión del sistema operativo. Para proyectos dirigidos a iOS 8 y superior, NSProcessInfo incluye un método para realizar comparaciones de versiones con menos posibilidades de error:

- (BOOL)isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion)version

Los proyectos dirigidos a sistemas más antiguos pueden usar systemVersion en UIDevice. Apple lo usa en su GLSprite Código de muestra.

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

Si por alguna razón decides eso systemVersion es lo que desea, asegúrese de tratarlo como una cadena o corre el riesgo de truncar el número de revisión del parche (por ejemplo, 3.1.2 -> 3.1).


906
2017-07-26 23:44



/*
 *  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")) {
    ...
}

1039
2017-08-06 09:39



Según lo sugerido por el documentos oficiales de Apple: puedes usar el NSFoundationVersionNumber, desde el NSObjCRuntime.h archivo de cabecera.

if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
    // here you go with iOS 7
}

245
2018-06-08 07:33



Iniciando Xcode 9, en C objetivo:

if (@available(iOS 11, *)) {
    // iOS 11 (or newer) ObjC code
} else {
    // iOS 10 or older code
}

Iniciando Xcode 7, en Rápido:

if #available(iOS 11, *) {
    // iOS 11 (or newer) Swift code
} else {
    // iOS 10 or older code
}

Para la versión, puede especificar MAYOR, MENOR o PARCHE (ver http://semver.org/ para las definiciones). Ejemplos:

  • iOS 11 y iOS 11.0 son la misma versión mínima
  • iOS 10, iOS 10.3, iOS 10.3.1 son diferentes versiones mínimas

Puede ingresar valores para cualquiera de esos sistemas:

  • iOS, macOS, watchOS, tvOS

Ejemplo de caso real tomado de uno de mis pods:

if #available(iOS 10.0, tvOS 10.0, *) {
    // iOS 10+ and tvOS 10+ Swift code
} else {
    // iOS 9 and tvOS 9 older code
}

documentación


63
2017-07-26 23:33



Tratar:

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
}

36
2017-10-07 11:33



Enfoque preferido

En Swift 2.0 Apple agregó verificación de disponibilidad usando una sintaxis mucho más conveniente (Leer más aquí) Ahora puede verificar la versión del sistema operativo con una sintaxis más clara:

if #available(iOS 9, *) {
    // Then we are on iOS 9
} else {
    // iOS 8 or earlier
}

Este es el preferido sobre el control respondsToSelector etc (Lo nuevo en Swift) Ahora el compilador siempre te avisará si no estás protegiendo tu código correctamente.


Pre Swift 2.0

Nuevo en iOS 8 es NSProcessInfo permitiendo mejores controles de versiones semánticas.

Despliegue en iOS 8 y superior

Para objetivos de despliegue mínimos de iOS 8.0 o superior, use NSProcessInfo operatingSystemVersion o isOperatingSystemAtLeastVersion.

Esto arrojaría lo siguiente:

let minimumVersion = NSOperatingSystemVersion(majorVersion: 8, minorVersion: 1, patchVersion: 2)
if NSProcessInfo().isOperatingSystemAtLeastVersion(minimumVersion) {
    //current version is >= (8.1.2)
} else {
    //current version is < (8.1.2)
}

Despliegue en iOS 7

Para objetivos de despliegue mínimos de iOS 7.1 o abajo, use comparar con    NSStringCompareOptions.NumericSearch en UIDevice systemVersion.

Esto rendiría:

let minimumVersionString = "3.1.3"
let versionComparison = UIDevice.currentDevice().systemVersion.compare(minimumVersionString, options: .NumericSearch)
switch versionComparison {
    case .OrderedSame, .OrderedDescending:
        //current version is >= (3.1.3)
        break
    case .OrderedAscending:
        //current version is < (3.1.3)
        fallthrough
    default:
        break;
}

Más lectura en NSHipster.


34
2017-09-18 21:58



Esto se usa para verificar la versión de SDK compatible en Xcode, esto es si tiene un equipo grande con diferentes versiones de Xcode o múltiples proyectos compatibles con diferentes SDK que comparten el mismo código:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
  //programming in iOS 8+ SDK here
#else
  //programming in lower than iOS 8 here   
#endif

Lo que realmente quieres es verificar la versión de iOS en el dispositivo. Puedes hacer eso con esto:

if ([[[UIDevice currentDevice] systemVersion] floatValue] < 8.0) {
  //older than iOS 8 code here
} else {
  //iOS 8 specific code here
}

Versión Swift:

if let version = Float(UIDevice.current.systemVersion), version < 9.3 {
    //add lower than 9.3 code here
} else {
    //add 9.3 and above code here
}

34
2017-07-27 06:32



Yo recomiendo:

if ([[[UIDevice currentDevice] systemVersion] floatValue] > 3.13) {
    ; // ...
}

crédito: ¿Cómo apuntar a una versión específica de iPhone?


19
2018-03-15 10:10



Siempre los guardo en mi archivo Constants.h:

#define IS_IPHONE5 (([[UIScreen mainScreen] bounds].size.height-568)?NO:YES) 
#define IS_OS_5_OR_LATER    ([[[UIDevice currentDevice] systemVersion] floatValue] >= 5.0)
#define IS_OS_6_OR_LATER    ([[[UIDevice currentDevice] systemVersion] floatValue] >= 6.0)
#define IS_OS_7_OR_LATER    ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
#define IS_OS_8_OR_LATER    ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)

8
2017-11-20 12:26