détecter "Autoriser les notifications" est activé / désactivé pour iOS8

J'essaie de détecter les parameters de notification locale pour l'application dans iOS 8

pour UIUserNotificationSettings , il me renvoie 7 car j'ai allumé tous les Badge, Sound & Alert.

Dans le cadre, j'éteins "Autoriser la notification", l'application me renvoie encore 7 pour UIUserNotificationSettings (Badge, Sound & Alert sur). Y at-il un moyen de détecter "Autoriser la Notification " on / off?

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

La méthode enabledRemoteNotificationTypes est obsolète depuis iOS8.

Pour vérifier l'état des notifications à distance dans iOS8, vous pouvez appeler

 [[UIApplication sharedApplication] isRegisteredForRemoteNotifications]; 

il renverra NO si l'user désactive les notifications dans les parameters. Documentation sur isRegisteredForRemoteNotifications

Ou vous pouvez récupérer tous les parameters de notification actuels:

 [[UIApplication sharedApplication] currentUserNotificationSettings]; 

Documentation sur 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 

Je m'excuse pour cette réponse / commentaire si elle est au mauvais endroit. Je suis vraiment nouveau dans la programmation iOS et je n'ai jamais posté de débordement de stack avant. Je pense que cela devrait être un commentaire, mais sans 50 je ne suis pas autorisé. Je m'excuse aussi si l'explication est un peu rudimentaire, mais encore une fois, un peu nouveau :).

Je souhaitais également tester si un user a modifié les notifications autorisées / requirejses par mon application après la request initiale. Après avoir essayé de déchiffrer la documentation d'Apple (les auteurs chez Apple sont soit beaucoup plus intelligents que moi, soit la documentation est délibérément obscure) et en faisant un peu de test, j'ai testé la valeur de

 [[UIApplication sharedApplication] currentUserNotificationSettings].hash. 

Je crois que cela returnne une valeur de hachage à trois bits où le bit un est pour les notifications de bannière, le bit 2 est pour les notifications sonores, et le bit 3 est pour les notifications d'alerte.

Alors…

 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. 

Cela indique également 0 si l' option Autoriser les notifications est désactivée dans l'application Paramètres. J'espère que cela t'aides.

Cela devrait marcher la première fois que votre application est lancée, l'user recevra une boîte de dialog, pour vérifier si l'user refuse ou autorise les notifications, utilisez:

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

Lors des lancements consécutifs, utilisez:

 [[UIApplication sharedApplication] isRegisteredForRemoteNotifications]; 

Pour vérifier l'état des notifications à distance dans iOS8 et iOS9, vous appelez:

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

Il renvoie true si votre application peut recevoir des notifications à distance. Toutefois, la réception de notifications à distance ne signifie pas qu'il les affichera également à l'user.

La requête registerForRemoteNotifications() réussit dans presque tous les cas et le didRegisterForRemoteNotificationsWithDeviceToken de didRegisterForRemoteNotificationsWithDeviceToken est appelé, ce qui vous donne le jeton de périphérique. L'application peut ensuite recevoir des notifications à distance silencieuses qui ne sont pas affichées pour l'user. Vous pouvez par exemple triggersr des process d'arrière-plan dans l'application lorsqu'une telle notification est reçue. Voir la documentation .

Pour non seulement recevoir mais également afficher des notifications à distance à l'user, vous devez requestr l'autorisation avec:

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

Cela affichera une boîte de dialog à l'user où ils peuvent autoriser ou refuser votre request. Indifférent de leur décision, l'application sera toujours en mesure de recevoir des notifications à distance.

Si les users le permettent, didRegisterForRemoteNotificationsWithDeviceToken de didRegisterForRemoteNotificationsWithDeviceToken est appelée.

Pour vérifier si l'user a autorisé ou refusé votre request ou en fait modifié les permissions de notifications plus tard dans iOS, vous appelez:

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

Voir la documentation .

Vous pouvez contrôler la valeur de hachage de UIApplication.sharedApplication().currentUserNotificationSettings() .

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

Swift 2

Dans AppDelegate:

 func application(application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) { if (notificationSettings.types == .None){ // User did NOT allowed notifications }else{ // User did allowed notifications } } 

À partir de n'importe quel autre ViewController:

  if UIApplication.sharedApplication().currentUserNotificationSettings()!.types.contains(.None){ }else{ } 

L'utilisation de .isRegisteredForRemoteNotifications() ne fonctionne pas (bien que cela devrait être le cas). Toutefois, lorsque les notifications sont désactivées ou l'un du type n'est pas présent, le code suivant fonctionne.

 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 } 

EDIT : après certains tests ne fonctionne pas toujours lorsque les notifications sont désactivées. J'envisage d'envoyer une notification de test pour savoir quand ils travaillent.

 UIUserNotificationType notificationType = [[[UIApplication sharedApplication] currentUserNotificationSettings] types]; if(notificationType == UIRemoteNotificationTypeNone) { NSLog(@"OFF"); } else{ NSLog(@"ON"); } 

travaille pour moi

Vous pouvez vérifier que l'user a activé ou désactivé les notifications Push en utilisant le code suivant.

Activer ou désactiver les notifications Push Iphone

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

J'espère que ceci vous aidera..