notification notificaciones ios ios7 swift push-notification apple-push-notifications

notification - iOS7 y iOS8: cómo detectar cuándo un usuario dijo No a una solicitud de notificaciones push



push notifications ios swift 4 (3)

Estoy creando una aplicación que apunta a iOS7 y iOS8. Le pido al usuario permiso para enviar notificaciones push. Pero por alguna razón, ni iOS7 ni iOS8 nunca llaman a mi application:didFailToRegisterForRemoteNotificationsWithError handler si hago clic en "No" cuando se me pide permiso de inserción.

Mi pregunta: ¿cómo puedo saber, tanto en iOS7 como en iOS8, cuándo el usuario ha rechazado la solicitud de notificaciones push, y cómo puedo saber si rechazaron la solicitud?

He mirado un montón de respuestas de StackOverflow y he implementado lo que sugieren, pero no está funcionando como se documenta:

  • iOS7: si el usuario aprueba la solicitud, el sistema llama a mi application:didRegisterForRemoteNotificationsWithDeviceToken: handler. Así que puedo decir que lo aprobaron. Pero si el usuario niega la solicitud , no obtengo una devolución de llamada a la application:didFailToRegisterForRemoteNotificationsWithError . Esto parece un error, y no puedo decir que el usuario rechazó la solicitud.
  • iOS8: si el usuario aprueba o rechaza la solicitud, el sistema llama a mi application:didRegisterUserNotificationSettings handler. Puedo ver el parámetro notificationSettings para ver si el usuario aprobó o rechazó mi solicitud, por lo que es útil. Sin embargo, si posteriormente llamo isRegisteredForRemoteNotifications() (por ejemplo, cuando la aplicación se active más adelante), siempre devuelve verdadero, incluso si el usuario ha rechazado la solicitud . Entonces obtengo un falso positivo. Esto parece un error y veo que otros también han notado esto . Actualización: si posteriormente llamo let settings = UIApplication.sharedApplication().currentUserNotificationSettings() , puedo verificar settings.types para ver si se permiten alertas. Así que para iOS8, parece que estoy listo.

Estoy usando un booleano NSUserDefaults para realizar un seguimiento de si ya le he pedido permiso al usuario.

Estoy usando dispositivos de hardware para pruebas (iPhone 4S con iOS7 y iPhone 5 con iOS8), no un simulador.

Estoy reiniciando mi dispositivo después de cada prueba , para hacer que muestre nuevamente la alerta de solicitud.

Así es como me registro para recibir notificaciones push. La rama if se toma en iOS8 y la rama else se toma en iOS7:

let application = UIApplication.sharedApplication() if (application.respondsToSelector("registerUserNotificationSettings:")) { let settings = UIUserNotificationSettings(forTypes: .Badge | .Alert | .Sound, categories: nil ) application.registerUserNotificationSettings(settings) } else { application.registerForRemoteNotificationTypes(.Badge | .Alert | .Sound) }

(En iOS8, cuando se llama la application:didRegisterUserNotificationSettings: llamo application.registerForRemoteNotifications() ).


Estaba tratando de encontrar una solución a este mismo problema.

Cuando se muestra el permiso UIAlert de notificación push, se muestra desde fuera de mi aplicación. Una vez que el usuario haya seleccionado "No permitir" o "Aceptar", mi aplicación se volverá a activar.

Tengo un controlador de vista que estoy presentando antes de pedirle al usuario los permisos Push. En este controlador de vista escucho la UIApplicationDidBecomeActiveNotification , y luego UIApplicationDidBecomeActiveNotification controlador de mi vista.

Esto ha funcionado bastante bien, mientras que todas las otras soluciones que he visto no me han funcionado en absoluto.


Su método didFailToRegisterForRemoteNotificationsWithError no se llama, porque el registro no falló, ni siquiera se intentó porque el usuario rechazó la solicitud.

En iOS7 puedes hacer un par de cosas:

  1. Supongamos que las notificaciones remotas no están disponibles hasta que se llama didRegisterForRemoteNotificationsWithDeviceToken
  2. Compruebe el valor enabledRemoteNotificationTypes en el objeto UIApplication

Suponiendo que está compilando con iOS8 o más reciente, puede usar el siguiente método de delegado:

func application(application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) { print("Notifications status: /(notificationSettings)") }

luego, en su didFinishLaunching (o donde sea apropiado para sus necesidades) debe invocar:

let app = UIApplication.sharedApplication() let settings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil) app.registerUserNotificationSettings(settings) app.registerForRemoteNotifications()

En este punto, se le preguntará a los usuarios con un mensaje típico de Permitir / No Permitir. Independientemente de la elección de su usuario, recibirá una llamada al método anterior, lo que le permitirá una configuración detallada de su aplicación. El resultado será algo así como:

Notification Status: <UIUserNotificationSettings: 0x7fa261701da0; types: (none);> Notification Status: <UIUserNotificationSettings: 0x7ff032e21dd0; types: (UIUserNotificationTypeAlert UIUserNotificationTypeBadge UIUserNotificationTypeSound);>

En el primer caso, notará que el usuario negó las notificaciones. El segundo es sobre la opción de permiso.