Déterminer sur l'iPhone si l'utilisateur a activé les notifications push
Je suis à la recherche d'un moyen pour déterminer si l'utilisateur a, à l'aide des paramètres, activé ou désactivé leurs notifications push pour mon application.
Vous devez vous connecter pour publier un commentaire.
Appel
enabledRemoteNotificationsTypes
et vérifier le masque.Par exemple:
iOS8 et ci-dessus:
UIRemoteNotificationType
est un masque de bits, de sorte qu'il doit être vérifié avec&
, pas==
!iOS 8
et de plus est faux, car il vérifie seulement si l'utilisateur est enregistré 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];
quantumpotato la question:
Où
types
est donnée paron peut utiliser
au lieu de
vous permettra de vérifier uniquement si les notifications sont activées (et ne vous inquiétez pas à propos des sons, des badges, le centre de notifications, etc.). La première ligne de code (
types & UIRemoteNotificationTypeAlert
) sera de retourYES
si Alerte "Style" est réglé sur "Bannières" ou les "Alertes", etNO
si Alerte "Style" est réglé sur "None", indépendamment des autres paramètres.grantedSettings.types.contains(notificationType)
Dans la dernière version de iOS cette méthode est maintenant obsolète. Pour supporter iOS 7 et iOS 8 utilisation:
UserNotifications
. Je n'ai pas de réponse aujourd'hui, malheureusement.Code mis à jour pour swift4.0 , iOS11
Code pour swift3.0 , iOS10
Vous trouverez ci-dessous un exemple complet qui couvre à la fois iOS8 et iOS7 (et versions inférieures). Veuillez noter qu'avant d'iOS8 vous ne pouvez pas faire la différence entre "à distance désactivé les notifications" et "seulement Vue lockscreen activé".
Swift 3+
RxSwift Observables Version pour iOS10+:
getNotificationSettings(...)
est asynchrone de sorte que le retour à l'intérieur sera d'ignorerEn essayant de soutenir à la fois iOS8 et plus bas, je n'ai pas eu beaucoup de chance en utilisant
isRegisteredForRemoteNotifications
que Kevin a suggéré. Au lieu de cela j'ai utilisécurrentUserNotificationSettings
, qui a très bien fonctionné lors de mes tests.isEnabled = NO;
dans votreif
cas n'est pas nécessaire, car elle a été initialisé commeNO
Malheureusement, aucune de ces solutions vraiment résoudre le problème, car à la fin de la journée, l'Api sont nettement insuffisantes quand il s'agit de fournir de l'information pertinente. Vous pouvez faire quelques suppositions cependant, l'utilisation de
currentUserNotificationSettings
(iOS8+) n'est tout simplement pas suffisant, dans sa forme actuelle pour vraiment répondre à la question. Bien que beaucoup de solutions ici semblent suggérer que c'est ça ouisRegisteredForRemoteNotifications
est plus d'une réponse définitive, il est vraiment pas.Considérez ceci:
avec
isRegisteredForRemoteNotifications
états de documentation:Toutefois, si vous jetez simplement un
NSLog
dans votre application délégué à observer le comportement, il est clair cela ne se comportent pas de la façon dont nous nous attendons à ce qu'il fonctionne. Elle porte directement à distance des notifications ayant été activé pour cette application/de l'appareil. Une fois activé pour la première fois ce sera toujours le retourYES
. Même les désactiver dans les paramètres (notifications) produira toujours ce retourYES
c'est parce que, comme d'iOS8, une application peut enregistrer à distance les notifications et même envoyer à un périphérique sans que l'utilisateur ait les notifications sont activées, ils juste ne peut pas faire des Alertes, des Badges et des Sons sans que l'utilisateur ne tournant que sur. Silencieux notifications sont un bon exemple de quelque chose que vous pouvez continuer à faire encore avec les notifications désactivées.Autant que
currentUserNotificationSettings
il indique que l'une des quatre choses:Alertes sont sur
Les Badges sont sur
Le son est sur
Aucun n'est sur.
Cela vous donne absolument aucune indication sur les autres facteurs ou de la Notification de l'interrupteur lui-même.
Un utilisateur peut en fait éteindre des badges, des sons et d'alertes, mais encore l'afficher sur l'écran de verrouillage ou dans le centre de notifications. Cet utilisateur doit encore recevoir des notifications push et être en mesure de les voir tous les deux sur l'écran de verrouillage et dans le centre de notification. Ils ont la notification sur le switch. MAIS
currentUserNotificationSettings
sera de retour:UIUserNotificationTypeNone
dans ce cas. Ce n'est pas vraiment révélateur de la utilisateurs paramètres réels.Quelques suppositions on peut faire:
isRegisteredForRemoteNotifications
estNO
alors vous pouvez supposer que ce dispositif n'a jamais enregistré avec succès à distance pour les notifications.application:didRegisterUserNotificationSettings:
est faite contenant de l'utilisateur paramètres de notification en ce moment puisque c'est la première fois qu'un utilisateur a été enregistré les paramètres devrait indiquer ce que l'utilisateur a sélectionné dans les termes de la demande d'autorisation. Si les paramètres correspondent à rien d'autre que:UIUserNotificationTypeNone
puis poussez l'autorisation a été accordée, sinon elle a été refusée. La raison pour cela est qu'à partir du moment où vous commencez l'enregistrement à distance du processus, l'utilisateur n'a la capacité d'accepter ou de refuser, avec les paramètres initiaux de l'acceptation étant les paramètres de configuration pendant le processus d'enregistrement.Pour compléter la réponse, il pourrait travailler à quelque chose comme ça...
edit: Ce n'est pas juste. puisque ce sont de bit-wise choses, il l'habitude de travailler avec un switch, j'ai donc fini à l'aide de ceci:
Pour iOS7 et avant de vous devrait en effet utiliser
enabledRemoteNotificationTypes
et vérifier si elle est égale à (ou n'est pas égal selon ce que vous voulez) àUIRemoteNotificationTypeNone
.Cependant pour iOS8 c'est pas toujours suffit de vérifier avec
isRegisteredForRemoteNotifications
autant d'état ci-dessus. Vous devriez également vérifier siapplication.currentUserNotificationSettings.types
est égal à (ou n'est pas égal selon ce que vous voulez)UIUserNotificationTypeNone
!isRegisteredForRemoteNotifications
peut retourner vrai même sicurrentUserNotificationSettings.types
retourneUIUserNotificationTypeNone
.Ici nous obtenons le UIRemoteNotificationType de UIApplication. Il représente l'état de notification push de cette application dans l'établissement, que vous pouvez consulter sur son type facilement
J'ai essayer de prendre en charge iOS 10 et ci-dessus en utilisant une solution à fournir par @Shaheen Ghiassy mais trouver la privation question
enabledRemoteNotificationTypes
. Donc, la solution que j'ai trouver en utilisantisRegisteredForRemoteNotifications
au lieu deenabledRemoteNotificationTypes
qui obsolète dans iOS 8. Voici ma mise à jour de la solution qui a fonctionné parfaitement pour moi:Et nous pouvons appeler cette fonction facilement et d'accéder à ses
Bool
valeur et pouvez le convertir dans la chaîne de valeur par la présente:Espère que ça va aider les autres aussi 🙂
Heureux de codage.
Si Zac de la réponse était parfaitement correcte jusqu'à iOS 7, il a changé depuis iOS 8 est arrivé. Parce que enabledRemoteNotificationTypes a été abandonné à partir de iOS 8 et suivantes. Pour iOS 8 et les versions ultérieures, vous devez utiliser isRegisteredForRemoteNotifications.
Ce Swifty solution a bien fonctionné pour moi (iOS8+),
Méthode:
Utilisation:
Ref
re:
c'est correct
mais suivant est correct aussi ! (comme UIRemoteNotificationTypeNone est 0 )
voir la suite
types
?Voici comment ce faire de Xamarin.ios.
Si vous prenez en charge iOS 10+ aller seulement avec l'UNUserNotificationCenter méthode.
Dans Xamarin, toutes les solutions ci-dessus ne fonctionne pas pour moi.
C'est ce que j'utilise à la place:
Il se fait un live mise à jour après que vous avez changé l'état actuel de notification dans les Paramètres.
Complet facile de copier et de coller le code construit à partir de @ZacBowling la solution de (https://stackoverflow.com/a/1535427/2298002)
cela permettra également d'apporter à l'utilisateur de vos paramètres d'application et de leur permettre d'activer immédiatement
J'ai également ajouté à la solution pour vérifier si les services de localisation est activé (et apporte de paramètres)
GLHF!