Quiero verificar si la iOS
versión del dispositivo es mayor de lo 3.1.3
que probé cosas como:
[[UIDevice currentDevice].systemVersion floatValue]
pero no funciona, solo quiero un:
if (version > 3.1.3) { }
¿Cómo puedo conseguir esto?
ios
objective-c
Juan
fuente
fuente
if #available(iOS 9, *) {}
en Swift. Iniciando Xcode 9,if (@available(iOS 11, *)) {}
en el objetivo-c.Respuestas:
La respuesta rápida ...
A partir de Swift 2.0, se puede utilizar
#available
en unaif
oguard
al código de protección que sólo se debe ejecutar 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 raros, 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 particular está disponible.
Comprobando la presencia de API:
Por ejemplo, puede verificar si
UIPopoverController
está disponible en el dispositivo actual usandoNSClassFromString
:Para clases débilmente vinculadas, es seguro enviar mensajes a la clase, directamente. En particular, esto funciona para marcos que no están vinculados explícitamente como "Requerido". Para las clases que faltan, la expresión se evalúa como nula y falla la condición:
Algunas clases, como
CLLocationManager
yUIDevice
, proporcionan métodos para verificar las capacidades del dispositivo:Comprobando la presencia de símbolos:
Muy ocasionalmente, debe 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. Pasar nulo a esta API se bloqueará, por lo que primero debe asegurarse de verificar la existencia de la constante:Comparando con la versión del sistema operativo:
Supongamos que enfrenta 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:Los proyectos dirigidos a sistemas más antiguos pueden usarse
systemVersion
enUIDevice
. Apple lo usa en su código de muestra GLSprite .Si por alguna razón decide que
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).fuente
-viewWillAppear
en aUISplitViewController
. Mi truco es determinar si es <iOS 4.0, y enviarlo al Controlador de vista detallada yo mismo en la Vista raíz-didSelectRowAtIndexPath
.[@"10.0" compare:@"10" options:NSNumericSearch]
retornosNSOrderedDescending
, que bien podrían no ser intencionados. (Podría esperarNSOrderedSame
). Esta es al menos una posibilidad teórica.respondsToSelector
et al no harían el trabajo, tienen que comparar versiones.NSFoundationVersionNumber
y solo si eso no es posible, debe verificar las versiones del sistemaUIDevice
.fuente
.0
números opcionales . Por ejemplo,SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0.0")
da un resultado incorrecto en iOS 7.0.Según lo sugerido por los documentos oficiales de Apple : puede usar
NSFoundationVersionNumber
, desde elNSObjCRuntime.h
archivo de encabezado.fuente
NSFoundationVersionNumber_iOS_6_1
no existe en iOS 5 SDK.#ifndef NSFoundationVersionNumber_iOS_7_0 #define NSFoundationVersionNumber_iOS_7_0 1047.00 #endif
. Para evitar jugar así, fui con la macro SYSTEM_VERSION_LESS_THAN (v) de yasirmturkNSFoundationVersionNumber_iOS_8_0
en iOS 9. solo buscaNSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1
Iniciando Xcode 9, en Objective-C :
Iniciando Xcode 7, en Swift :
Para la versión, puede especificar el MAYOR, el MENOR o el PARCHE (consulte http://semver.org/ para ver las definiciones). Ejemplos:
iOS 11
yiOS 11.0
son la misma versión mínimaiOS 10
,iOS 10.3
,iOS 10.3.1
Son diferentes versiones mínimasPuede ingresar valores para cualquiera de esos sistemas:
iOS
,macOS
,watchOS
,tvOS
Ejemplo de caso real tomado de uno de mis pods :
documentación
fuente
if (...) {} else { ... }
guard
en Objective-C en lugar de dejar el bloque abierto y sangrar en laelse
declaración?if
bloque vacío seguido de unelse
.if
bloques vacíos .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 que admiten diferentes SDK que comparten el mismo código:
Lo que realmente desea es verificar la versión de iOS en el dispositivo. Puedes hacer eso con esto:
Versión rápida:
Las versiones actuales de swift deberían usar esto:
fuente
Tratar:
fuente
Enfoque preferido
En Swift 2.0, Apple agregó la verificación de disponibilidad utilizando una sintaxis mucho más conveniente (Lea más aquí ). Ahora puede verificar la versión del sistema operativo con una sintaxis más limpia:
Este es el preferido sobre la comprobación,
respondsToSelector
etc. ( Novedades de Swift ). Ahora el compilador siempre te avisará si no estás protegiendo tu código correctamente.Pre Swift 2.0
Nuevo en iOS 8 está
NSProcessInfo
permitiendo mejores controles de versiones semánticas.Implementación en iOS 8 y superior
Esto produciría lo siguiente:
Implementación en iOS 7
Esto produciría:
Más lectura en NSHipster .
fuente
Siempre los guardo en mi archivo Constants.h:
fuente
.pch
archivo de su proyecto XCodeConstants.h
archivo que se importa en mipch
archivo.fuente
Con la clase Version que se incluye en el proyecto nv-ios-version (Apache License, Version 2.0), es fácil obtener y comparar la versión de iOS. Un código de ejemplo a continuación volca la versión de iOS y verifica si la versión es mayor o igual a 6.0.
Página del proyecto: nv-ios-version
TakahikoKawasaki / nv-ios-version
Blog: Obtenga y compare la versión de iOS en tiempo de ejecución con la clase Versión
Obtenga y compare la versión de iOS en tiempo de ejecución con la clase Versión
fuente
Nueva forma de verificar la versión del sistema utilizando el rápido Forget [[UIDevice currentDevice] systemVersion] y NSFoundationVersionNumber.
Podemos usar NSProcessInfo -isOperatingSystemAtLeastVersion
fuente
UIDevice + IOSVersion.h
UIDevice + IOSVersion.m
fuente
En general, es mejor preguntar si un objeto puede realizar un selector dado, en lugar de verificar un número de versión para decidir si debe estar presente.
Cuando esto no es una opción, debe tener un poco de cuidado aquí porque las
[@"5.0" compare:@"5" options:NSNumericSearch]
devolucionesNSOrderedDescending
podrían no ser intencionadas; Podría esperarNSOrderedSame
aquí. Esto es al menos una preocupación teórica, una que vale la pena defender en mi opinión.También vale la pena considerar la posibilidad de una entrada de versión incorrecta con la que no se puede comparar razonablemente. Manzana suministra las tres constantes predefinidas
NSOrderedAscending
,NSOrderedSame
yNSOrderedDescending
aunque no puedo pensar en un uso para alguna cosa que se llamaNSOrderedUnordered
en el caso de que no puedo comparar dos cosas y quiero devolver un valor que indica esto.Además, no es imposible que Apple algún día expanda sus tres constantes predefinidas para permitir una variedad de valores de retorno, haciendo una comparación
!= NSOrderedAscending
imprudente.Dicho esto, considere el siguiente código.
fuente
Donde, por supuesto,
NSFoundationVersionNumber_iOS_6_1
debe cambiarse según corresponda para la versión de iOS que desea verificar. Lo que he escrito probablemente se usará mucho al probar si un dispositivo ejecuta iOS7 o una versión anterior.fuente
un poco tarde para la fiesta, pero a la luz de iOS 8.0, esto podría ser relevante:
si puedes evitar usar
[[UIDevice currentDevice] systemVersion]
En su lugar, verifique la existencia de un método / clase / lo que sea.
Me pareció útil para el administrador de ubicaciones donde tengo que llamar a requestWhenInUseAuthorization para iOS 8.0 pero el método no está disponible para iOS <8
fuente
fuente
Sé que esta es una vieja pregunta, pero alguien debería haber mencionado las macros en tiempo de compilación
Availability.h
. Todos los demás métodos aquí son soluciones de tiempo de ejecución, y no funcionarán en un archivo de encabezado, categoría de clase o definición de ivar.Para estas situaciones, use
h / t esta respuesta
fuente
Luego agregue una condición if de la siguiente manera: -
fuente
Hay versiones como 7.0 o 6.0.3, por lo que simplemente podemos convertir la versión en números para comparar. si la versión es como 7.0, simplemente agregue otro ".0" y luego tome su valor numérico.
Para 6.0.0
para 7.0
fuente
6.1.10
. entonces este algoritmo rendirá6110 > 700
, lo cual no es correcto.Prueba el siguiente código:
fuente
Solo para recuperar el valor de cadena de la versión del sistema operativo:
fuente
Como una variación de la solución yasimturks, definí una función y algunos valores de enumeración en lugar de cinco macros. Me parece más elegante, pero eso es cuestión de gustos.
Uso:
archivo .h:
archivo .m:
Debe agregar el prefijo de su aplicación a los nombres, especialmente al
Comparison
tipo.fuente
Utilizando la forma recomendada recomendada ... si no hay una definición en los archivos de encabezado, siempre puede obtener la versión imprimiéndola en la consola con un dispositivo de la versión IOS deseada.
fuente
Solución para verificar la versión de iOS en Swift
Contras de esta solución: es simplemente una mala práctica verificar los números de versión del sistema operativo, de cualquier manera que lo haga. Uno nunca debe codificar las dependencias de esta manera, siempre verificar las características, capacidades o la existencia de una clase. Considera esto; Apple puede lanzar una versión de una clase compatible con versiones anteriores, si lo hicieran, el código que sugiera nunca lo usaría ya que su lógica busca un número de versión del sistema operativo y NO la existencia de la clase.
( Fuente de esta información )
Solución para verificar la existencia de clases en Swift
No lo use
if (NSClassFromString("UIAlertController") == nil)
porque funciona correctamente en el simulador de iOS con iOS 7.1 y 8.2, pero si prueba en un dispositivo real con iOS 7.1, lamentablemente notará que nunca pasará por la parte más del fragmento de código.fuente
fuente
Una versión más genérica en Obj-C ++ 11 (probablemente podría reemplazar algunas de estas cosas con las funciones NSString / C, pero esto es menos detallado. Esto le brinda dos mecanismos. SplitSystemVersion le brinda una matriz de todas las partes que es útil si solo desea activar la versión principal (p
switch([self splitSystemVersion][0]) {case 4: break; case 5: break; }
. ej .).fuente
Prueba esto
fuente
fuente
float versionToBeCompared = 3.1.3;
Ni siquiera puedo compilar.Ejemplo rápido que realmente funciona:
No use NSProcessInfo porque no funciona con 8.0, por lo que es prácticamente inútil hasta 2016
fuente
Aquí hay una versión rápida:
Uso:
fuente
struct iOSVersion { static let SYS_VERSION_FLOAT = (UIDevice.currentDevice().systemVersion as NSString).floatValue static let iOS7 = (iOSVersion.SYS_VERSION_FLOAT < 8.0 && iOSVersion.SYS_VERSION_FLOAT >= 7.0) static let iOS8 = (iOSVersion.SYS_VERSION_FLOAT >= 8.0 && iOSVersion.SYS_VERSION_FLOAT < 9.0) static let iOS9 = (iOSVersion.SYS_VERSION_FLOAT >= 9.0 && iOSVersion.SYS_VERSION_FLOAT < 10.0) }