Detectar "Permitir notificaciones" está activado/desactivado para iOS8
uilocalnotification (11)
Estoy tratando de detectar la configuración de notificaciones locales para la aplicación en iOS 8
para UIUserNotificationSettings
, me devuelve 7 ya que he activado todos los distintivos, sonido y alerta.
En la configuración, desactivo "Permitir notificación", la aplicación aún me devuelve 7 para UIUererNotificationSettings (Insignia, sonido y alerta activados). ¿Hay una manera de detectar "Permitir Notification
" activado / desactivado?
- (void)application:(UIApplication *)application
didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings{
NSLog(@"---notificationSettings.types %d" , notificationSettings.types );
if(notificationSettings.types!=7){
UIAlertView * alert =[[UIAlertView alloc ] initWithTitle:@"Please turn on Notification"
message:@"Go to Settings > Notifications > App./n Switch on Sound, Badge & Alert"
delegate:self
cancelButtonTitle:@"Ok"
otherButtonTitles: nil];
[alert show];
}
}
El método enabledRemoteNotificationTypes
está en desuso desde iOS8.
Para verificar el estado de las notificaciones remotas en iOS8 puede llamar
[[UIApplication sharedApplication] isRegisteredForRemoteNotifications];
devolverá NO si el usuario deshabilita las notificaciones en Configuración. Documentation en isRegisteredForRemoteNotifications
O puede recuperar todos los ajustes de notificación actuales:
[[UIApplication sharedApplication] currentUserNotificationSettings];
Documentation sobre currentUserNotificationSettings
El uso de .isRegisteredForRemoteNotifications()
no funciona (aunque debería). Sin embargo, cuando las notificaciones están deshabilitadas o uno de los tipos no está presente, el siguiente código funciona.
func notificationsAreOk() -> Bool {
let wishedTypes = UIUserNotificationType.Badge |
UIUserNotificationType.Alert |
UIUserNotificationType.Sound;
let application = UIApplication.sharedApplication()
let settings = application.currentUserNotificationSettings()
if settings == nil {
return false
}
if settings.types != wishedTypes {
return false
}
return true
}
EDITAR : después de algunas pruebas no siempre funciona cuando las notificaciones están deshabilitadas. Estoy considerando enviar una notificación de prueba para saber cuándo funcionan.
Esto debería funcionar la primera vez que se inicie su aplicación, el usuario obtendrá un cuadro de diálogo para verificar si el usuario niega o permite las notificaciones, use:
-(void)application:(UIApplication *)application didRegisterUserNotificationSettings: (UIUserNotificationSettings *)notificationSettings
{
if (notificationSettings.types) {
NSLog(@"user allowed notifications");
[[UIApplication sharedApplication] registerForRemoteNotifications];
}else{
NSLog(@"user did not allow notifications");
// show alert here
}
}
En lanzamientos consecutivos, use:
[[UIApplication sharedApplication] isRegisteredForRemoteNotifications];
Me disculpo por esta respuesta / comentario si está en el lugar equivocado. Soy REALMENTE nuevo en la programación de iOS y nunca antes he publicado en el desbordamiento de pila. Creo que esto debería ser un comentario, pero sin una calificación de 50 no estoy permitido. También me disculpo si la explicación es un tanto rudimentaria, pero de nuevo, algo nuevo :).
También quise comprobar si un usuario ha cambiado las notificaciones permitidas / requeridas por mi aplicación después de la solicitud inicial. Después de tratar de descifrar la documentación de Apple (los escritores de Apple son mucho más inteligentes que yo, o la documentación es intencionalmente oscura) y haciendo un poco de pruebas probé el valor de
[[UIApplication sharedApplication] currentUserNotificationSettings].hash.
Creo que esto devuelve un valor de hash de tres bits donde el bit uno es para notificaciones de Banner, el bit 2 es para notificaciones de sonido y el bit 3 para notificaciones de alerta.
Asi que...
000 = 0 = no notifications.
001 = 1 = only banner,
010 = 2 = only sound,
011 = 3 = sound and banner, no alert
100 = 4 = only alert notifications
and so on until,
111 = 7 = all notifications on.
Esto también muestra 0 si Permitir notificaciones está desactivado en la aplicación Configuración. Espero que esto ayude.
Para verificar el estado de las notificaciones remotas en iOS8 y iOS9, llame:
// Obj-C
[[UIApplication sharedApplication] isRegisteredForRemoteNotifications];
// Swift
UIApplication.sharedApplication().isRegisteredForRemoteNotifications
Devuelve true
si su aplicación puede recibir notificaciones remotas. Sin embargo, recibir notificaciones remotas no significa que también se las muestre al usuario.
La solicitud registerForRemoteNotifications()
exitosa en casi todos los casos y se llama a la AppDelegate''s didRegisterForRemoteNotificationsWithDeviceToken
que le da el token del dispositivo. La aplicación puede recibir notificaciones remotas silenciosas que no se muestran al usuario. Por ejemplo, puede activar procesos en segundo plano en la aplicación cuando se recibe dicha notificación. Ver Documentation .
No solo para recibir, sino también para mostrar notificaciones remotas al usuario con el que solicita permiso:
// Swift
let notificatonSettings = UIUserNotificationSettings(forTypes: [.Badge, .Alert, .Sound], categories: nil)
UIApplication.sharedApplication().registerUserNotificationSettings(notificatonSettings)
Esto mostrará un diálogo al usuario donde puede permitir o denegar su solicitud. Indiferente de su decisión, la aplicación aún podrá recibir notificaciones remotas.
Si los usuarios lo permiten, AppDelegate''s didRegisterForRemoteNotificationsWithDeviceToken
se llama.
Para verificar si el usuario permitió o rechazó su solicitud o, de hecho, cambió los permisos de notificaciones más adelante en la configuración de iOS a la que llama:
// Obj-C
[[UIApplication sharedApplication] currentUserNotificationSettings];
// Swift
UIApplication.sharedApplication().currentUserNotificationSettings()
Ver Documentation .
Puede controlar el valor de hash de UIApplication.sharedApplication().currentUserNotificationSettings()
.
if(UIApplication.instancesRespondToSelector(Selector("registerUserNotificationSettings:"))){
if(UIApplication.sharedApplication().currentUserNotificationSettings().hashValue == 0){
pushNotificationStatus = "false"
} else {
pushNotificationStatus = "true"
}
}
Puede verificar que el conjunto de usuarios habilite o deshabilite Notificaciones Push usando el siguiente código.
Habilitar o deshabilitar las notificaciones push de Iphone
UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
if (types == UIRemoteNotificationTypeNone)
// Yes it is..
Espero que esto te ayudará..
Swift 2
En AppDelegate:
func application(application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) {
if (notificationSettings.types == .None){ // User did NOT allowed notifications
}else{ // User did allowed notifications
}
}
Desde cualquier otro ViewController:
if UIApplication.sharedApplication().currentUserNotificationSettings()!.types.contains(.None){
}else{
}
mira esto. El código es probado y probado.
- (BOOL)isUserNotificationAllowed {
UIUserNotificationType types = [[UIApplication sharedApplication] currentUserNotificationSettings].types;
if(types & UIUserNotificationTypeBadge || types & UIUserNotificationTypeSound || types & UIUserNotificationTypeAlert){
return YES;
}
else {
return NO;
}
}
Swift 3+
let isRegisteredForLocalNotifications = UIApplication.shared.currentUserNotificationSettings?.types.contains(UIUserNotificationType.alert) ?? false
Swift 2.3
let isRegisteredForLocalNotifications = UIApplication.sharedApplication().currentUserNotificationSettings()?.types.contains(UIUserNotificationType.Alert) ?? false
UIUserNotificationType notificationType = [[[UIApplication sharedApplication] currentUserNotificationSettings] types];
if(notificationType == UIRemoteNotificationTypeNone)
{
NSLog(@"OFF");
}
else{
NSLog(@"ON");
}
funciona para mi