En este breve tutorial, me gustaría centrarme en la nueva sintaxis de Swift para verificar la disponibilidad. Si ha realizado cualquier cantidad de desarrollo de iOS o OS X, estoy seguro de que sabe lo tedioso que puede ser comprobar si una API en particular está disponible en el dispositivo en el que se está ejecutando su aplicación. En Swift 2, esto se ha vuelto mucho menos molesto para los desarrolladores..
Imagina el siguiente escenario. Estás desarrollando una aplicación iOS que se enfoca en iOS 7 y superiores. Durante la WWDC del año pasado, Apple presentó una nueva API para el registro de notificaciones.
registerUserNotificationSettings (_ :)
¿Eso significa que debe aumentar el objetivo de implementación de su aplicación de iOS 7 a iOS 8? Podría hacer eso, pero dejaría una parte importante de la base de usuarios de su aplicación en el frío, solo para cumplir con la nueva política de Apple para notificaciones locales y remotas. Tus usuarios no te lo agradecerán..
La alternativa es usar solo la nueva API en dispositivos que ejecutan iOS 8 y superiores. Eso tiene más sentido. ¿Derecha? La implementación se vería algo así..
func application (aplicación: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool if UIApplication.instancesRespondToSelector ("registerUserNotificationSettings:") let types = UIUerererNotificationType. UIUserNotificationType.Sound | UIUserNotificationType.Badge deja settings = UIUserNotificationSettings (forTypes: types, categories: nil) application.registerUserNotificationSettings (settings) return true
Esta es una opción viable, pero no está exenta de riesgos. En este tutorial, no voy a entrar en detalles sobre lo que implican esos riesgos, pero quiero enfatizar que la mayoría de los desarrolladores piensan que está bien usar el enfoque anterior. El siguiente ejemplo muestra una variación de este enfoque, esta vez utilizando Objective-C.
if ([UIUserNotificationSettings class]) [application registerUserNotificationSettings: [UIUserNotificationSettings settingsForTypes: (UIUserNotificationTypeAlert) UIUserNotificationTypeSound | UIUserNotificationTypeAlert) nilUserNotificationTypeSound |
Si bien ambos enfoques funcionarán en la mayoría de las situaciones, hay situaciones en las que se encontrará con problemas. Algunas API, por ejemplo, comienzan su vida como API privadas y se hacen públicas en una etapa posterior. En ese escenario, puede terminar llegando a API privadas en dispositivos que ejecutan un sistema operativo en el que esas API aún no son públicas. Y estoy seguro de que sabes lo que eso significa..
Gracias al trabajo del equipo de Swift, la solución a nuestro problema es simple y directa en Swift 2. Observe el siguiente ejemplo. Tenga en cuenta que el destino de la implementación del proyecto se establece en iOS 7, usando Swift 2 y Xcode 7.
En el ejemplo, estamos usando las API que se introdujeron en iOS 8. Como el compilador sabe que el objetivo de implementación del proyecto está configurado en iOS 7, genera un error y nos dice que las API que queremos usar solo están disponibles en iOS 8 y más. Esto lo sabe al inspeccionar el SDK para obtener información sobre la disponibilidad. Si presionas Mando y haga clic en el registerUserNotificationSettings (_ :)
método, deberías ver algo como esto.
@disponible (iOS 8.0, *) func registerUserNotificationSettings (notificationSettings: UIUserNotificationSettings)
Afortunadamente, Xcode nos da una solución para resolver el problema. Se sugiere utilizar una verificación de versión para evitar que se llame a las API exclusivas de iOS 8 y superiores si nuestros usuarios ejecutan la aplicación en una versión anterior de iOS.
Tenga en cuenta que esta función se introdujo en Swift 2. El compilador no generará ningún error si está utilizando Swift 1.2. La adición de la verificación de versión también hace que el ejemplo sea más fácil de entender. Eche un vistazo al ejemplo actualizado a continuación, en el que seguimos los consejos que nos da Xcode..
func application (aplicación: UIApplication, didFinishLaunchingWithOptions launchOptions: [¿NSObject: AnyObject]?) -> Bool if #available (iOS 8.0, *) let tipos = UIUspartsasperspersperspersperspersonsonsperspersperspersonsonspoonsypsiksasonsaspersonsonspersperspoonsypsificationsype ([UIUserNotificationType.Alert) let settings = UIUserNotificationSettings (forTypes: tipos, categorías: nil) application.registerUserNotificationSettings (settings) return true
La sintaxis es clara y comprensible. Usando la sintaxis de disponibilidad, verificamos si la aplicación se está ejecutando en un dispositivo con iOS 8 y superior. Si no lo es, el Si
se omite la cláusula, de lo contrario, la aplicación llama a la nueva API para el registro de notificaciones.
La sintaxis es sencilla. Comenzamos la condición de disponibilidad con #disponible
y envolver la condición entre paréntesis. Podemos agregar tantas plataformas como sea necesario, separando la lista de plataformas con comas.
if #available (iOS 8.0, OSX 10.10, watchOS 2, *) …
Tenga en cuenta que terminamos la lista de plataformas con un asterisco. Este asterisco es requerido e indica que el Si
La cláusula se ejecuta en el destino de implementación mínimo para cualquier plataforma que no esté incluida en la lista de plataformas..
Como vimos anteriormente, podemos usar el @disponible
atributo para agregar información de disponibilidad a funciones, métodos y clases. En el siguiente ejemplo, le decimos al compilador que useFancyNewAPI
Solo se debe llamar en dispositivos que ejecutan iOS 9 y superiores.
@available (iOS 9.0, *) func useFancyNewAPI () …
Tenga en cuenta que la sintaxis de disponibilidad no es una alternativa para los dos ejemplos que le mostré al comienzo de este tutorial. Estos ejemplos son defectuosos y solo deben usarse si está utilizando Objective-C o una versión anterior de Swift.
La sintaxis de disponibilidad es otra razón más para migrar sus proyectos Swift a Swift 2. Se deshace de las soluciones propensas a errores para verificar la disponibilidad de la API. El mundo parece un poco más amigable con Swift 2. ¿No es así??