95 votes

Vérifier si les notifications push à distance sont activées dans iOS 9 et iOS 10 sur Swift iOS

Comment puis-je vérifier si l'utilisateur a activé les notifications à distance sur iOS 9 ou iOS 10 ?

Si l'utilisateur n'a pas autorisé ou a cliqué sur Non, je veux basculer un message demandant s'ils souhaitent activer les notifications.

169voto

Ogulcan Points 1433

Apple recommande d'utiliser le framework UserNotifications au lieu d'instances partagées. N'oubliez donc pas d'importer le framework UserNotifications. Comme ce framework est nouveau dans iOS 10, il est vraiment sûr d'utiliser ce code uniquement dans les applications construites pour iOS 10+.

let current = UNUserNotificationCenter.current()

current.getNotificationSettings(completionHandler: { (settings) in
    if settings.authorizationStatus == .notDetermined {
        // L'autorisation de notification n'a pas encore été demandée, allez-y !
    } else if settings.authorizationStatus == .denied {
        // L'autorisation de notification a été refusée précédemment, allez dans les paramètres et la confidentialité pour réactiver
    } else if settings.authorizationStatus == .authorized {
        // L'autorisation de notification a déjà été accordée
    }
})

Vous pouvez vérifier la documentation officielle pour plus d'informations : https://developer.apple.com/documentation/usernotifications

2 votes

Il me semble que c'est la réponse correcte à partir de juillet 2017.

2 votes

Pourquoi n'est-ce pas cet if else if et else?

0 votes

@OgulcanOrhan oui je sais que ça fonctionne - j'ai utilisé votre code et j'ai voté pour votre réponse juste pour que vous le sachiez :) - je voulais juste savoir pourquoi les trois conditionnels doivent être appelés? Je suis un peu pointilleux je suppose

75voto

Rajat Points 8837

Réponse mise à jour après que iOS 10 utilise UNUserNotificationCenter.

Tout d'abord, vous devez import UserNotifications puis

let current = UNUserNotificationCenter.current()
current.getNotificationSettings(completionHandler: { permission in
    switch permission.authorizationStatus  {
    case .authorized:
        print("L'utilisateur a accordé la permission de notification")
    case .denied:
        print("L'utilisateur a refusé la permission de notification")
    case .notDetermined:
        print("La permission de notification n'a pas encore été demandée")
    case .provisional:
        // @available(iOS 12.0, *)
        print("L'application est autorisée à publier des notifications utilisateur non-interruptives.")
    case .ephemeral:
        // @available(iOS 14.0, *)
        print("L'application est temporairement autorisée à publier des notifications. Disponible uniquement pour les extraits d'application.")
    @unknown default:
        print("Statut inconnu")
    }
})

Ce code fonctionnera jusqu'à iOS 9, pour iOS 10 utilisez le snippet de code ci-dessus.

let isRegisteredForRemoteNotifications = UIApplication.shared.isRegisteredForRemoteNotifications
if isRegisteredForRemoteNotifications {
     // L'utilisateur est enregistré pour les notifications
} else {
     // Afficher une alerte indiquant que l'utilisateur n'est pas enregistré pour les notifications
}

2 votes

Cela ne semble pas fonctionner pour iOS 10. Dans le simulateur, j'ai cliqué sur "Ne pas autoriser" et ce code indiquait toujours que l'utilisateur est inscrit pour les notifications à distance.

0 votes

Fonctionne pour moi sur iOS 10. Essayez d'utiliser un appareil réel au lieu du simulateur.

8 votes

Cela vous indique seulement si le jeton a été généré (l'appareil a été enregistré), pas si les notifications ont été bloquées.

40voto

tylerSF Points 873

J'ai essayé la solution de Rajat, mais cela n'a pas fonctionné pour moi sur iOS 10 (Swift 3). Il disait toujours que les notifications push étaient activées. Voici comment j'ai résolu le problème. Cela affiche "non activé" si l'utilisateur a appuyé sur "Ne pas autoriser" ou si vous n'avez pas encore demandé à l'utilisateur.

let notificationType = UIApplication.shared.currentUserNotificationSettings!.types
    if notificationType == [] {
        print("les notifications ne sont PAS activées")
    } else {
        print("les notifications sont activées")
    }

PS : La méthode currentUserNotificationSettings a été obsolète dans iOS 10.0 mais elle fonctionne toujours.

0 votes

Est-ce que cela fonctionnera sur iOS 9, 8, 7, etc... ou ai-je besoin d'un code séparé ?

0 votes

Je ne suis pas sûr, je l'ai seulement vérifié sur iOS 10.

3 votes

Cam, je viens de tester ce code sur la version 10.2 (sur un téléphone) et sur la version 9.3 (sur le simulateur) et cela a fonctionné sur les deux. tylerSF, merci pour la solution.

33voto

Imtee Points 679

Si votre application prend en charge iOS 10 et iOS 8, 9 utilisez le code ci-dessous

// En haut, importer UserNotifications 
// pour utiliser UNUserNotificationCenter
import UserNotifications

Ensuite,

if #available(iOS 10.0, *) {
    let current = UNUserNotificationCenter.current()
    current.getNotificationSettings(completionHandler: { settings in

        switch settings.authorizationStatus {

        case .notDetermined:
            // La demande d'autorisation n'a pas encore été faite
        case .denied:
            // L'utilisateur a refusé l'autorisation.
            // Vous pourriez leur dire de changer cela dans les paramètres
        case .authorized:
            // L'utilisateur a donné son autorisation.
        }
    })
 } else {
     // Retour sur les versions antérieures
     if UIApplication.shared.isRegisteredForRemoteNotifications {
         print("APNS-YES")
     } else {
         print("APNS-NO")
     }
 }

21voto

joel prithivi Points 179

Dans iOS11, Swift 4...

 UNUserNotificationCenter.current().getNotificationSettings { (settings) in
        if settings.authorizationStatus == .authorized {
            // Déjà autorisé
        }
        else {
            // Soit refusé ou non déterminé
            UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) {
                (granted, error) in
                  // ajoutez votre propre logique ici
                UNUserNotificationCenter.current().delegate = self
                let alertController = UIAlertController(title: "Notification Alert", message: "veuillez activer les notifications", preferredStyle: .alert)
                let settingsAction = UIAlertAction(title: "Paramètres", style: .default) { (_) -> Void in
                    guard let settingsUrl = URL(string: UIApplicationOpenSettingsURLString) else {
                        return
                    }
                    if UIApplication.shared.canOpenURL(settingsUrl) {
                        UIApplication.shared.open(settingsUrl, completionHandler: { (success) in
                        })
                    }
                }
                let cancelAction = UIAlertAction(title: "Annuler", style: .default, handler: nil)
                alertController.addAction(cancelAction)
                alertController.addAction(settingsAction)
                DispatchQueue.main.async {
                    self.window?.rootViewController?.present(alertController, animated: true, completion: nil)

                }
            }
        }
    }

0 votes

Je reçois une erreur avec Utilisation de l'identificateur non résolu 'UNUserNotificationCenter'; vouliez-vous dire 'NSNotificationCenter'?

4 votes

@ChrisO vous devez importer UserNotifications

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X