Notificaciones push no recibidas en iOS 10, pero trabajando en iOS 9 y antes

Tengo varias aplicaciones que fueron escritas en Swift 2.2, comstackdas con Xcode 7.3 y están en vivo en App Store. Las aplicaciones utilizan Notificaciones Push y funcionan bien en iOS 9.3 y versiones anteriores.

Sin embargo, en los dispositivos que se han actualizado a iOS 10, mis aplicaciones no reciben Notificaciones Push. Los dispositivos que todavía ejecutan iOS 9 todavía están recibiendo notifications.

Pensando que podría tratarse de un certificate o un problema de titularidad, he probado lo siguiente: actualicé una de mis aplicaciones a Swift 2.3, agregué el derecho de entorno de APS y lo compilé en Xcode 8, pero esto no significó ninguna diferencia.

En mi AppDelegate todavía tengo los methods existentes para registrarse para las notifications push que incluyen:

let notificationSettings = UIUserNotificationSettings(forTypes: [.Badge, .Sound, .Alert], categories:nil) application.registerUserNotificationSettings(notificationSettings) 

Este logging parece ser exitoso incluso en iOS 10, ya que luego se llama a la aplicación didRegisterForRemoteNotificationsWithDeviceToken , así que estoy recibiendo un token de APNS.

El problema es que cuando envío una notificación push a este dispositivo, la aplicación didReceiveRemoteNotification nunca se llama.

Ahora, aquí se dice que los methods en UIApplicationDelegate están en desuso en iOS 10 y debería implementar userNotificationCenter ( : didReceive: withCompletionHandler 🙂 y userNotificationCenter ( : willPresent: withCompletionHandler 🙂

El problema es que no solo estoy apuntando a iOS 10. Todavía necesito la aplicación para trabajar en iOS 8 y 9, así que dudo que sea el enfoque correcto para implementar esos methods.

¿Cómo obtengo notifications push para que una aplicación existente continúe trabajando en dispositivos que se han actualizado a iOS 10? ¿Debo reescribir el código? ¿Solo necesito actualizar algunos certificates o derechos y volver a comstackr en Xcode 8 con algunas configuraciones "nuevas"?

Ok, lo he descubierto. Ahora tengo mis Notificaciones Push originales que funcionaban en iOS 9 trabajando en iOS 10 con Xcode 8 y Swift 2.3.

Implementé esto haciendo los siguientes cambios en mi AppDelegate:

1) En la configuration de mi proyecto, en la pestaña de Capacidades, me desploop hacia abajo a "Notificaciones Push" y lo vuelvo a "ENCENDIDO". Esto genera automáticamente un file de derechos que contiene la key "Entorno APS" y con valor "desarrollo".

2) En AppDelegate.swift hago varios cambios de código. Empiezo importando el marco UserNotifications:

 import UserNotifications 

Entonces, tengo AppDelegate implementar el protocolo UNUserNotificationCenterDelegate:

 class AppDelegate: /*Some other protocols I am extending...*/, UNUserNotificationCenterDelegate { 

Luego agrego el siguiente método:

 func registerForPushNotifications(application: UIApplication) { if #available(iOS 10.0, *){ UNUserNotificationCenter.currentNotificationCenter().delegate = self UNUserNotificationCenter.currentNotificationCenter().requestAuthorizationWithOptions([.Badge, .Sound, .Alert], completionHandler: {(granted, error) in if (granted) { UIApplication.shanetworkingApplication().registerForRemoteNotifications() } else{ //Do stuff if unsuccessful... } }) } else{ //If user is not on iOS 10 use the old methods we've been using let notificationSettings = UIUserNotificationSettings( forTypes: [.Badge, .Sound, .Alert], categories: nil) application.registerUserNotificationSettings(notificationSettings) } } 

Entonces llamo a esta function recién creada dentro de didFinishLaunchingWithOptions:

 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { ... registerForPushNotifications(application) ... } 

Dejo mi método doRegisterForRemoteNotificationsWithDeviceToken sin modificar:

 func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) { //Implement this. Do something with the token I receive. Send it to my push notification server to register the device or something else I'd like to do with the token. } 

Ahora implemento dos nuevos methods para iOS 10 para manejar la recepción de Notificaciones Push:

 @available(iOS 10.0, *) func userNotificationCenter(center: UNUserNotificationCenter, willPresentNotification notification: UNNotification, withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void) { //Handle the notification } @available(iOS 10.0, *) func userNotificationCenter(center: UNUserNotificationCenter, didReceiveNotificationResponse response: UNNotificationResponse, withCompletionHandler completionHandler: () -> Void) { //Handle the notification } 

No eliminé ninguno de los methods que previamente implementé para Push Notifications en iOS 9.

He solucionado este problema usando el siguiente paso:

Paso 1: vaya a Proyecto -> Destino -> Capacidades -> Notificaciones push -> Enciéndalo

introduzca la descripción de la imagen aquí Paso 2: problema solucionado relacionado con el certificate adecuado, perfil de aprovisionamiento

Paso 3: salga de Xcode, limpie y corra

IOS 10 tiene un kit de notificación diferente.

 import UserNotifications func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { if #available(iOS 10.0, *) { let center = UNUserNotificationCenter.current() center.requestAuthorization(options: [.badge, .alert , .sound]) { (granted, error) in if granted { UIApplication.shanetworking.registerForRemoteNotifications() } } } else { let type: UIUserNotificationType = [UIUserNotificationType.badge, UIUserNotificationType.alert, UIUserNotificationType.sound] let setting = UIUserNotificationSettings(types: type, categories: nil) UIApplication.shanetworking.registerUserNotificationSettings(setting) UIApplication.shanetworking.registerForRemoteNotifications() } } func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data){ let token = String(format: "%@", deviceToken as CVarArg) } 

En varias respuestas de SO a preguntas sobre notifications push de iOS 9 frente a iOS 10, he probado las siguientes testings:

1) actualice las llamadas de notificación para usar específicamente el dispositivo UNUserNotificationCenter para dispositivos iOS 10

2) actualice la capacidad Push para que se actualice el file de derechos

Puedo confirmar que al hacer el número 2 y al mantener todo su código de activación de iOS 9 igual, se permitirán las notifications básicas de inserción en los dispositivos iOS 10

Cuando mi aplicación se movió de iOS 9 a iOS 10, las notifications push silenciosas enviadas por mi server Parse alojado en Heroku dejaron de recibir la aplicación.

El único cambio que realicé para que las notifications funcionen nuevamente fue modificar el Javascript en mi server para que el argumento para el contenido disponible sea un integer 1 y no una cadena "1"

  Parse.Push.send({ where: notifyDeletedRequestsQuery, data: { 'content-available': 1, refresh: constants.requestsClassName } }, { useMasterKey: true }); 

También tenga en count que el contenido disponible no puede aparecer en la misma notificación de inserción como cnetworkingencial, sonido o alerta .