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.
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.
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
@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
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
}
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.
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.
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.
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.
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")
}
}
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)
}
}
}
}
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.