detectar “Permitir notificaciones” está activado / desactivado para iOS8

Intento detectar la configuración de notificaciones locales para la aplicación en iOS 8

para UIUserNotificationSettings , me devuelve 7 porque he activado todas las Insignias, Sonidos y Alertas.

En la configuración, apago “Permitir notificación”, la aplicación aún me devuelve 7 para UIUserNotificationSettings (Badge, Sound & Alert activado). ¿Hay alguna manera de activar / desactivar “Permitir Notification “?

 - (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. Documentación sobre isRegisteredForRemoteNotifications

O puede recuperar todas las configuraciones de notificación actuales:

 [[UIApplication sharedApplication] currentUserNotificationSettings]; 

Documentación sobre currentUserNotificationSettings

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 

Me disculpo por esta respuesta / comentario si está en el lugar equivocado. Soy REALMENTE nuevo en la progtwigción de iOS y nunca antes había publicado un desbordamiento de stack. 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 algo rudimentaria, pero de nuevo, algo nuevo :).

También deseaba probar 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 deliberadamente 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 las notificaciones de Banner, el bit 2 para las notificaciones de Sonido y el bit 3 para las 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 e iOS9, llame a:

 // 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 las mostrará al usuario.

La solicitud registerForRemoteNotifications() tiene éxito en casi todos los casos y se llama a la aplicación didRegisterForRemoteNotificationsWithDeviceToken de AppDelegate que le proporciona 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 la documentación .

Para no solo recibir sino también mostrar notificaciones remotas al usuario, solicita permiso con:

 // Swift let notificatonSettings = UIUserNotificationSettings(forTypes: [.Badge, .Alert, .Sound], categories: nil) UIApplication.sharedApplication().registerUserNotificationSettings(notificatonSettings) 

Esto mostrará un cuadro de diálogo para el usuario en el que puede permitir o denegar su solicitud. Indiferente a su decisión, la aplicación aún podrá recibir notificaciones remotas.

Si los usuarios lo permiten, se llama a didRegisterForRemoteNotificationsWithDeviceToken de AppDelegate.

Para verificar si el usuario permitió o denegó su solicitud o, de hecho, cambió los permisos de notificaciones más adelante en la configuración de iOS, usted llama:

 // Obj-C [[UIApplication sharedApplication] currentUserNotificationSettings]; // Swift UIApplication.sharedApplication().currentUserNotificationSettings() 

Ver la documentación .

Esto debería funcionar la primera vez que se inicia su aplicación, el usuario obtendrá un 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]; 

Puede controlar el valor hash de UIApplication.sharedApplication().currentUserNotificationSettings() .

 if(UIApplication.instancesRespondToSelector(Selector("registerUserNotificationSettings:"))){ if(UIApplication.sharedApplication().currentUserNotificationSettings().hashValue == 0){ pushNotificationStatus = "false" } else { pushNotificationStatus = "true" } } 

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{ } 
 UIUserNotificationType notificationType = [[[UIApplication sharedApplication] currentUserNotificationSettings] types]; if(notificationType == UIRemoteNotificationTypeNone) { NSLog(@"OFF"); } else{ NSLog(@"ON"); } 

funciona para mi

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.

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; } } 

Puede verificar que el conjunto de usuarios habilite o deshabilite las notificaciones automáticas con el siguiente código.

Habilitar o deshabilitar las notificaciones de Iphone Push

 UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes]; if (types == UIRemoteNotificationTypeNone) // Yes it is.. 

Espero que esto te ayudará..