mail - Configuración de notificaciones push iOS: Permiso denegado versus permiso nunca solicitado
onesignal ios ionic (3)
No
Y creo que esto se hace intencionalmente. Porque el escenario habitual es registrarse para notificaciones remotas en cada lanzamiento de la aplicación. Eso significa que el usuario no debe ver el diálogo de permisos cada vez que abre la aplicación. iOS hace esto automáticamente. Pero si muestra una pantalla adicional antes de solicitar permisos, Apple no puede permitirle saber si el usuario denegó permisos en el pasado, por lo que puede mostrar una pantalla que describa cómo el usuario puede habilitar sus permisos a través de la configuración cada vez que lo desee. Esto deshará todo lo que hizo Apple para evitar irritar a los usuarios.
En tu caso, debes seguir la misma estrategia. Muestre solo un tipo de pantalla explicativa en ambos escenarios y guarde la opción del usuario en NSUserDefaults
para saber si no debe volver a mostrarla. Los usuarios que denegaron permisos previamente no verán el cuadro de diálogo de permisos. Aunque tendrá un beneficio para los nuevos usuarios (que obviamente está tratando de lograr): puede seguir mostrando la pantalla explicativa muchas veces si el usuario la canceló.
¿Es posible diferenciar entre los casos donde
- un usuario de iOS ha denegado explícitamente los permisos de notificación del usuario, y
- ¿A un usuario de iOS nunca se le pidió permiso?
Mi situación: en el pasado, solicité permiso de notificación al usuario, pero nunca hice un seguimiento de las solicitudes. Más tarde, dejé de intentar registrar cualquier configuración de notificación. Ahora, me gustaría volver a introducir las notificaciones de usuario.
Después de un evento importante en la aplicación, mi plan es mostrar algún tipo de interfaz de usuario que explique el beneficio de optar por las notificaciones de los usuarios. Sin embargo, si el usuario ya ha rechazado, preferiría mostrar una interfaz de usuario separada que pueda llevarlos a Settings.app.
Actualmente, estoy usando -[UIApplication currentUserNotificationSettings]
para obtener la configuración actual, pero parece que esto devuelve UIUserNotificationTypeNone
para ambos casos descritos anteriormente.
Personalmente, no he encontrado una forma de determinar esto mediante una consulta rápida del iOS SDK.
Sin embargo, he podido rastrear esto yo mismo registrando cuándo -[UIApplication application:didRegisterUserNotificationSettings:]
se llama.
Cuando iOS llama a este método, puede estar seguro de que se le han solicitado permisos de notificación al usuario y (lo que es importante) ha aceptado o denegado.
Guardando cuando esto ocurre, puede verificar más tarde este valor para determinar si el aviso se ha mostrado antes o no.
Código de ejemplo:
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"ABHasPromptedForUserNotification"];
//... your other notification registration handling...
}
- (BOOL)hasPromptedForUserNotification {
return [[NSUserDefaults standardUserDefaults] boolForKey:@"ABHasPromptedForUserNotification"];
}
FYI: he encontrado preferible configurar "ABHasPromptedForUserNotification"
como verdadero en la -[UIApplication application:didRegisterUserNotificationSettings:]
lugar de cuando llamo -[UIApplication registerForRemoteNotifications]
ya que en algunas situaciones el usuario puede mostrar la solicitud varias veces. Esto puede suceder si el usuario crea un fondo de la aplicación o recibe una llamada. En estos casos, el aviso estará oculto por iOS y se mostrará nuevamente la próxima vez que llame -[UIApplication registerForRemoteNotifications]
. Establecer esta configuración en el delegado evita pensar que se le ha solicitado al usuario anteriormente y no se le volverá a preguntar en estos casos extremos.
Si admite iOS 10 y superior, el marco UNUserNotifications permite más granularidad.
let current = UNUserNotificationCenter.current()
current.getNotificationSettings(completionHandler: { (settings) in
if settings.authorizationStatus == .notDetermined {
// Not requested
}
if settings.authorizationStatus == .denied {
// User said Don''t allow
}
})