developer - Las notificaciones push no se reciben en iOS 10, pero funcionan en iOS 9 y antes
push notifications ios firebase (5)
Tengo varias aplicaciones que fueron escritas en Swift 2.2, compiladas con Xcode 7.3 y están en vivo en la App Store. Las aplicaciones utilizan notificaciones automáticas 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 siguen recibiendo notificaciones.
Pensando que podría tratarse de un problema de certificación o de titularidad, he intentado lo siguiente: Actualicé una de mis aplicaciones a Swift 2.3, agregué la titularidad de entorno APS y la compilé en Xcode 8, pero esto no hizo ninguna diferencia.
En mi AppDelegate todavía tengo los métodos existentes para registrarme para recibir notificaciones push que incluyen:
let notificationSettings = UIUserNotificationSettings(forTypes: [.Badge, .Sound, .Alert], categories:nil)
application.registerUserNotificationSettings(notificationSettings)
Este registro parece tener éxito incluso en iOS 10 desde que se llamó a Application didRegisterForRemoteNotificationsWithDeviceToken , por lo que recibo un token de APNS.
El problema es que cuando envío una notificación de inserción a este dispositivo, nunca se llama a la aplicación didReceiveRemoteNotification .
Ahora, here se dice que los métodos en UIApplicationDelegate están en desuso en iOS 10 y debo implementar userNotificationCenter ( : didReceive: withCompletionHandler :) y userNotificationCenter ( : willPresent: withCompletionHandler :)
El problema es que SOLO no estoy apuntando a iOS 10. Todavía necesito que la aplicación funcione en iOS 8 y 9, por lo que dudo que sea el enfoque correcto para implementar esos métodos.
¿Cómo obtengo notificaciones push para que una aplicación existente continúe trabajando en dispositivos que se han actualizado a iOS 10? ¿Necesito reescribir el código? ¿Necesito actualizar algunos certificados o derechos y recompilar en Xcode 8 con algunas configuraciones "nuevas"?
Cuando mi aplicación pasó de IOS 9 a IOS 10, las notificaciones push silenciosas enviadas por mi servidor Parse alojado en Heroku dejaron de ser recibidas por la aplicación.
El único cambio que hice para que las notificaciones volvieran a funcionar fue modificar el Javascript en mi servidor para que el argumento de contenido disponible fuera un número entero 1 y no una cadena "1"
Parse.Push.send({
where: notifyDeletedRequestsQuery,
data: {
''content-available'': 1,
refresh: constants.requestsClassName
}
}, { useMasterKey: true });
También tenga en cuenta que el contenido disponible no puede aparecer en la misma notificación de inserción como distintivo, sonido o alerta .
En varias respuestas de SO a preguntas sobre las notificaciones push de iOS 9 vs iOS 10, he probado las siguientes pruebas:
1) actualice las llamadas de notificación para usar específicamente UNUserNotificationCenter para dispositivos con iOS 10
2) actualizar la capacidad de inserción para que se actualice el archivo de derechos
Puedo confirmar que hacer el # 2 y mantener el mismo código push de iOS 9 existente permitirá que las notificaciones push básicas lleguen a los dispositivos iOS 10
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.shared.registerForRemoteNotifications()
}
}
} else {
let type: UIUserNotificationType = [UIUserNotificationType.badge, UIUserNotificationType.alert, UIUserNotificationType.sound]
let setting = UIUserNotificationSettings(types: type, categories: nil)
UIApplication.shared.registerUserNotificationSettings(setting)
UIApplication.shared.registerForRemoteNotifications()
}
}
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data){
let token = String(format: "%@", deviceToken as CVarArg)
}
Ok lo he descubierto. Ahora tengo mis Notificaciones Push originales que funcionaban en iOS 9, funcionando en iOS 10 con Xcode 8 y Swift 2.3.
Implementé esto haciendo los siguientes cambios en mi AppDelegate:
1) En la configuración de mi proyecto, en la pestaña de Capacidades, me desplazo hacia "Notificaciones de inserción" y la enciendo en "ON". Esto genera automáticamente un archivo de derechos que contiene la clave "Entorno APS" y con valor "desarrollo".
2) En AppDelegate.swift hago varios cambios de código. Comienzo importando el framework UserNotifications:
import UserNotifications
Luego tengo a AppDelegate implementando el protocolo UNUserNotificationCenterDelegate:
class AppDelegate: /*Some other protocols I am extending...*/, UNUserNotificationCenterDelegate {
Luego añado 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.sharedApplication().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)
}
}
Luego llamo a esta función recién creada dentro de didFinishLaunchingWithOptions:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
...
registerForPushNotifications(application)
...
}
Dejo mi método didRegisterForRemoteNotificationsWithDeviceToken sin cambios:
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 métodos 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 métodos que he implementado anteriormente para notificaciones push en iOS 9.