Je cherche un moyen de déterminer si l'utilisateur a, via les paramètres, activé ou désactivé ses notifications push pour mon application.
207
Je cherche un moyen de déterminer si l'utilisateur a, via les paramètres, activé ou désactivé ses notifications push pour mon application.
Appelez enabledRemoteNotificationsTypes
et vérifiez le masque.
Par exemple:
UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
if (types == UIRemoteNotificationTypeNone)
// blah blah blah
iOS8 et supérieur:
[[UIApplication sharedApplication] isRegisteredForRemoteNotifications]
iOS 8
et plus est incorrecte car elle vérifie uniquement si l'utilisateur s'est inscrit pour la notification à distance. Selon la documentation:This method reflects only the successful completion of the remote registration process that begins when you call the registerForRemoteNotifications method. This method does not reflect whether remote notifications are actually available due to connectivity issues. The value returned by this method takes into account the user’s preferences for receiving remote notifications.
[[UIApplication sharedApplication] currentUserNotificationSettings];
problème de quantumpotato:
Où
types
est donné paron peut utiliser
au lieu de
vous permettra de vérifier uniquement si les notifications sont activées (et ne vous inquiétez pas des sons, des badges, du centre de notification, etc.). La première ligne de code (
types & UIRemoteNotificationTypeAlert
) sera renvoyéeYES
si "Style d'alerte" est défini sur "Bannières" ou "Alertes", etNO
si "Style d'alerte" est défini sur "Aucun", quels que soient les autres paramètres.la source
grantedSettings.types.contains(notificationType)
Dans la dernière version d'iOS, cette méthode est désormais obsolète. Pour prendre en charge iOS 7 et iOS 8, utilisez:
la source
UserNotifications
. Malheureusement, je n'ai pas de réponse complète maintenant.Code mis à jour pour swift4.0, iOS11
Code pour swift3.0, iOS10
la source
Vous trouverez ci-dessous un exemple complet qui couvre à la fois iOS8 et iOS7 (et les versions inférieures). Veuillez noter qu'avant iOS8, vous ne pouviez pas faire la distinction entre «notifications à distance désactivées» et «uniquement Afficher dans l'écran de verrouillage activé».
la source
Swift 3+
Version observable RxSwift pour iOS10 +:
la source
getNotificationSettings(...)
est asynchrone donc le retour à l'intérieur sera ignoréEn essayant de prendre en charge iOS8 et inférieur, je n'ai pas eu beaucoup de chance à utiliser
isRegisteredForRemoteNotifications
comme Kevin l'a suggéré. Au lieu de cela, j'ai utilisécurrentUserNotificationSettings
, ce qui a très bien fonctionné dans mes tests.la source
isEnabled = NO;
dans vosif
cas, il n'est pas nécessaire car il a été initialisé commeNO
Malheureusement, aucune de ces solutions fournies ne résout vraiment le problème car, en fin de compte, les API manquent sérieusement lorsqu'il s'agit de fournir les informations pertinentes. Vous pouvez faire quelques suppositions mais l'utilisation
currentUserNotificationSettings
(iOS8 +) n'est tout simplement pas suffisante dans sa forme actuelle pour vraiment répondre à la question. Bien que beaucoup de solutions semblent suggérer que ce soit ouisRegisteredForRemoteNotifications
est plutôt une réponse définitive, ce n'est vraiment pas le cas.Considère ceci:
avec la
isRegisteredForRemoteNotifications
documentation indique:Cependant, si vous jetez simplement
NSLog
un délégué dans votre application pour observer le comportement, il est clair que cela ne se comporte pas de la façon dont nous prévoyons que cela fonctionnera. Il s'agit en fait directement des notifications à distance ayant été activées pour cette application / cet appareil. Une fois activé pour la première fois, il reviendra toujoursYES
. Même les désactiver dans les paramètres (notifications) entraînera toujours ce retourYES
car, à partir d'iOS8, une application peut s'enregistrer pour les notifications à distance et même envoyer vers un appareil sans que l'utilisateur ait activé les notifications, il se peut qu'il ne fasse pas d'alertes, Badges et sons sans que l'utilisateur n'active cela. Les notifications silencieuses sont un bon exemple de quelque chose que vous pouvez continuer à faire même avec des notifications désactivées.Pour autant
currentUserNotificationSettings
qu'il indique l'une des quatre choses:Les alertes sont activées Les badges sont activés Le son est activé Aucun n'est activé.
Cela ne vous donne absolument aucune indication sur les autres facteurs ou le commutateur de notification lui-même.
Un utilisateur peut en effet désactiver les badges, le son et les alertes, mais les afficher sur l'écran de verrouillage ou dans le centre de notification. Cet utilisateur doit toujours recevoir des notifications push et pouvoir les voir à la fois sur l'écran de verrouillage et dans le centre de notifications. Ils ont le commutateur de notification activé. MAIS
currentUserNotificationSettings
reviendra:UIUserNotificationTypeNone
dans ce cas. Ce n'est pas vraiment indicatif des paramètres réels des utilisateurs.Quelques suppositions que l'on peut faire:
isRegisteredForRemoteNotifications
c'est le cas,NO
vous pouvez supposer que cet appareil ne s'est jamais enregistré avec succès pour les notifications à distance.application:didRegisterUserNotificationSettings:
est effectué contenant les paramètres de notification de l'utilisateur à ce moment car c'est la première fois qu'un utilisateur est enregistré, les paramètres doivent indiquer ce que l'utilisateur a sélectionné en termes de demande d'autorisation. Si les paramètres correspondent à autre chose que:UIUserNotificationTypeNone
alors l'autorisation push a été accordée, sinon elle a été refusée. La raison en est qu'à partir du moment où vous commencez le processus d'enregistrement à distance, l'utilisateur n'a que la possibilité d'accepter ou de refuser, les paramètres initiaux d'une acceptation étant les paramètres que vous avez définis pendant le processus d'enregistrement.la source
Pour compléter la réponse, cela pourrait fonctionner quelque chose comme ça ...
modifier: Ce n'est pas juste. comme ce sont des trucs au niveau des bits, cela ne fonctionnera pas avec un commutateur, j'ai donc fini par utiliser ceci:
la source
Pour iOS7 et avant, vous devez en effet utiliser
enabledRemoteNotificationTypes
et vérifier s'il est égal (ou différent en fonction de ce que vous voulez)UIRemoteNotificationTypeNone
.Cependant, pour iOS8, il ne suffit pas toujours de vérifier avec
isRegisteredForRemoteNotifications
autant d'états ci-dessus. Vous devriez également vérifier siapplication.currentUserNotificationSettings.types
égal (ou différent selon ce que vous voulez)UIUserNotificationTypeNone
!isRegisteredForRemoteNotifications
pourrait retourner vrai même sicurrentUserNotificationSettings.types
retourneUIUserNotificationTypeNone
.la source
la source
Ici, nous obtenons le UIRemoteNotificationType de UIApplication. Il représente l'état de la notification push de cette application dans le paramètre, que vous pouvez vérifier facilement sur son type
la source
J'essaie de prendre en charge iOS 10 et supérieur en utilisant la solution fournie par @Shaheen Ghiassy mais je trouve un problème de privation
enabledRemoteNotificationTypes
. Donc, la solution que je trouve en utilisantisRegisteredForRemoteNotifications
au lieu deenabledRemoteNotificationTypes
celle obsolète dans iOS 8. Voici ma solution mise à jour qui a parfaitement fonctionné pour moi:Et nous pouvons appeler cette fonction facilement et accéder à sa
Bool
valeur et la convertir en valeur de chaîne par ceci:J'espère que cela aidera les autres aussi :) Bon codage.
la source
Bien que la réponse de Zac était parfaitement correcte jusqu'à iOS 7, elle a changé depuis l'arrivée d'iOS 8. Parce que enabledRemoteNotificationTypes est obsolète à partir d'iOS 8. Pour iOS 8 et versions ultérieures, vous devez utiliser isRegisteredForRemoteNotifications .
la source
Cette solution Swifty a bien fonctionné pour moi ( iOS8 + ),
Méthode :
Utilisation :
Réf.
la source
ré:
c'est correct
mais ce qui suit est correct aussi! (comme UIRemoteNotificationTypeNone est 0)
voir ce qui suit
la source
Voici comment procéder dans Xamarin.ios.
Si vous prenez en charge iOS 10+, utilisez uniquement la méthode UNUserNotificationCenter.
la source
Dans Xamarin, la solution ci-dessus ne fonctionne pas pour moi. C'est ce que j'utilise à la place:
Il reçoit également une mise à jour en direct après avoir modifié l'état de la notification dans les paramètres.
la source
Copiez et collez du code facilement et entièrement à partir de la solution de @ ZacBowling ( https://stackoverflow.com/a/1535427/2298002 )
cela amènera également l'utilisateur aux paramètres de votre application et lui permettra d'activer immédiatement
J'ai également ajouté une solution pour vérifier si les services de localisation sont activés (et apporte également des paramètres)
GL HF!
la source