¿Cómo admitir las características de iOs 9, mientras se mantiene el soporte de iOs 8?

Básicamente la pregunta está en el título. Estoy seguro de que hay una forma de enviar su aplicación a una versión anterior de iOs (8 en este caso), aunque todavía puede usar una característica exclusiva de una versión más reciente del sistema operativo. Ejemplo: Mi aplicación tiene un soporte mínimo de iOs 8.3, y con la última versión de iOs 9, quiero agregar soporte para forzar el toque (que solo está disponible en iOs 9), pero al mismo time, quiero poder corregir errores y hacer mejoras en la interfaz de usuario, por ejemplo, y enviar la actualización a ambas versiones. Las principales aplicaciones hacen esto, fb por ejemplo, así que DEBEN ser una forma, pero no pude encontrarla en ningún lado, me estoy rindiendo 🙁

EDITAR : ¿hay una forma clara de hacerlo? sin verificar respondsToSelector y este tipo de cosas? ¿Algo como proyecto separado? o tal vez los files xcconfig pueden hacer este truco? Solo me pregunto … porque tener un if else en cada ios 9 function específica no es realmente una buena solución cuando estás hablando de una empresa / aplicación grande

La function de disponibilidad de Swift 2 debería resolver sus problemas. Con la disponibilidad, Swift crea soporte para versiones de sistema operativo y testings de disponibilidad de símbolos.

Primero, configure su objective de implementación en la configuration de compilation para iOS 8.3 y su SDK base a Último. Si usa símbolos (classs, methods, etc.) en su proyecto que solo están disponibles en sistemas operativos más nuevos que su objective de implementación (iOS 8.3), Xcode mostrará un post de error con un arreglo en esa línea cuando intente comstackr y ejecuta tu proyecto.

Consulte Comprobar disponibilidad de la API en el capítulo Flujo de control del libro de lenguaje de progtwigción Swift .

Una verificación de disponibilidad se ve así:

 if #available (iOS 9, *) { // use APIs only available on iOS 9 or later } else { // do nothing, don't show feature in UI, etc } 

Esos son los conceptos básicos. En la segunda parte de su pregunta, lo que está buscando es una forma de manejar la disponibilidad de la API en una escala mayor. Para hacer esto, puede usar otra característica de la function de disponibilidad de Swift 2, el atributo @available . Puede aplicar este atributo a cualquier definición de símbolo, por ejemplo, una class, para marcar que la definición del símbolo requiere una cierta versión mínima del sistema operativo.

En lugar de utilizar una verificación de disponibilidad en todos los lugares donde utiliza una API iOS 9, puede usar el atributo @available en una class completa. Entonces, solo necesita usar una verificación de disponibilidad en el lugar donde usa esa class. Por ejemplo:

 @available(iOS 9, *) class MyAwesomeiOSNineFeature { var myCoolObject = UICooliOSNineThing() func doAwesomeStuff() { // lots of code that uses iOS 9 stuff, no availability check } func doOtherStuff() { // lots of code that uses iOS 9 stuff, no availability check } } // In another class that doesn't have an `@available` requirement: if #available(iOS 9, *) { let feature = MyAwesomeiOSNineFeature() feature.doAwesomeStuff() } else { // don't show UI for new feature } 

configure el "Objetivo de implementación de iOS" en Configuraciones de compilation a 8.3 y su SDK base a Último iOS (iOS 9.0).

puede tener código de iOS 9 en classs compatibles con iOS 8, solo asegúrese de que ningún código iOS 9 solo se ejecute en un dispositivo iOS 8. puede usar answerSToSelector: o [[UIDevice currentDevice] systemVersion] para ayudarlo.

un dispositivo que esté en iOS 9 no significa que tenga un toque 3d, debería usar la propiedad forceTouchCapability para determinar si el dispositivo tiene un toque 3d y hacer que determinadas partes de su código reaccionen de manera apropiada

si necesita saber qué versión de iOS está ejecutando el dispositivo, eche un vistazo a este hilo y puede usar sentencias if-else para hacer que su código reaccione de manera apropiada (como asegurarse de que la propiedad realmente exista en esta versión del sistema de dispositivos)