Réinitialiser les paramètres de notification push pour l'application

173

Je développe une application avec des notifications push. Pour vérifier toutes les manières possibles d'interaction de l'utilisateur, j'aimerais tester mon application lorsqu'un utilisateur refuse d'activer les notifications push pour mon application lors du premier démarrage.

registerForRemoteNotificationTypesCependant, la boîte de dialogue (initiée par ) n'apparaît qu'une seule fois par application. Comment réinitialiser la mémoire iPhone OS de mon application. La suppression de l'application et la réinstallation n'aident pas.

hanno
la source

Réponses:

300

Note technique TN2265: Dépannage des notifications push

La première fois qu'une application activée par push s'enregistre pour les notifications push, iOS demande à l'utilisateur s'il souhaite recevoir des notifications pour cette application. Une fois que l'utilisateur a répondu à cette alerte, celle-ci n'est plus présentée à moins que l'appareil ne soit restauré ou que l'application ait été désinstallée pendant au moins un jour.

Si vous souhaitez simuler une première exécution de votre application, vous pouvez laisser l'application désinstallée pendant une journée. Vous pouvez réaliser ce dernier sans attendre réellement un jour en réglant l'horloge système d'un jour ou plus en avant, en éteignant complètement l'appareil, puis en le rallumant.

Mise à jour: comme indiqué dans les commentaires ci-dessous, cette solution a cessé de fonctionner depuis iOS 5.1. Je vous encourage à déposer un bogue auprès d'Apple afin qu'ils puissent mettre à jour leur documentation. La solution actuelle semble être de réinitialiser le contenu et les paramètres de l'appareil.

Mise à jour: la note technique a été mise à jour avec de nouvelles étapes qui fonctionnent correctement à partir d'iOS 7.

  1. Supprimez votre application de l'appareil.
  2. Éteignez complètement l'appareil et rallumez-le.
  3. Accédez à Paramètres> Général> Date et heure et réglez la date avant un jour ou plus.
  4. Éteignez à nouveau complètement l'appareil et rallumez-le.

MISE À JOUR à partir d'iOS 9

Le simple fait de supprimer et de réinstaller l'application réinitialisera l'état de la notification à notDetermined(ce qui signifie que des invites apparaîtront).

Merci à la réponse de Gomfucius ci-dessous: https://stackoverflow.com/a/33247900/704803

ianolito
la source
16
Quelqu'un a-t-il essayé cela avec iOS 5.1? J'ai suivi ces étapes à la lettre et je n'arrive toujours pas à réinitialiser l'appareil ... J'ai même essayé de régler l'horloge sur mon Mac avant de l'installer via Xcode.
nrj
1
Idem ... Je n'ai pas reçu d'invite.
Rob
2
Apple a ajouté une nouvelle exigence aux directives de soumission de l'AppStore, qui repose sur l'application pour afficher l'invite. Cela peut suggérer que l'invite automatique a été supprimée dans iOS 5.1. Cependant, il n'y a pas d'API pour interroger les paramètres du centre de notification, donc vous ne savez pas quel serait le but de l'invite de toute façon. Voir ma réponse à un problème similaire: stackoverflow.com/questions/10191006/…
Greg
10
C'est ridicule. Apple ne se rend-il pas compte que les développeurs ou même les utilisateurs pourraient vouloir être en mesure de réinitialiser ces choses sans utiliser une solution de contournement vraiment mauvaise?
sudo
2
Quand j'essaye ceci dans le simulateur, j'obtiens le code d'erreur = 3010 "les notifications à distance ne sont pas prises en charge dans le simulateur"
Thomas Zimmer
48

Une autre solution juste pour tester cela consiste simplement à modifier votre identifiant de bundle. N'oubliez pas de le modifier une fois que vous avez terminé!

capikaw
la source
12
N'avez-vous pas également besoin de créer un certificat pour le nouvel identifiant d'application afin de le tester?
Tony
1
Cela ne fonctionnera que si vous utilisez des profils d'approvisionnement basés sur des caractères génériques - sinon, vous devrez créer un profil pour le nouveau bundle.
Zorayr
Même si vous devez créer un nouveau profil, il vous suffit de cliquer sur le bouton "Réparer" et d'attendre quelques secondes - beaucoup plus rapidement que de passer par tous ces cycles de redémarrage.
Ilya
c'est la solution la plus rapide! Cela marche plutôt bien pour moi ! Lorsque vous modifiez votre bundle_id, vous ne pourrez pas signer l'application avec les mêmes "profils d'approvisionnement". Mais ne vous inquiétez pas, dans xCode (ma version 7.1.1), vous pouvez cliquer sur "réparer" et il fera le travail. N'oubliez pas non plus l'onglet «Capacités», où vous pouvez avoir plusieurs éléments à «réparer» (en cliquant sur le bouton «réparer») et là, cela fonctionnera très bien!
Dam Fa
Cette réponse est une option légitime mais toujours un hack-fix pour une situation idiote d'Apple. Je ne modifie pas le bundleID, ni ne change l'horloge de l'appareil. Tout aussi approprié, n'importe quel développeur pourrait écrire un code court affichant un UIAlertView qui demande "Autoriser les notifications push?" .. Oui = appeler la méthode register; Non = appelez didFailToRegisterForRemoteNotificationsWithError (etc.). Techniquement, c'est le meilleur moyen de donner aux utilisateurs la connaissance des informations de confidentialité ... POURQUOI le push doit être activé ou facultatif.
Tom Pace
36

Sur iOS 9.0.2, j'obtiens «l'alerte de notification push d'enregistrement» chaque fois que je supprime l'application et la réinstalle. Cela est vrai à la fois pour les téléchargements de production AppStore et pour le mode adhoc.

MISE À JOUR: Il est confirmé que cela fonctionne pour iOS 9.x

Genki
la source
1
J'ai le même comportement sous iOS 9.x. Je vous recommande de modifier la réponse originale en ajoutant une MISE À JOUR:
Yevhen Dubinin
3
Finalement! Plus besoin de supprimer une application, d'éteindre l'appareil, de régler l'horloge sur une heure d'avance et de trucs idiots comme celui-ci.
mkeremkeskin
19

Comme déjà noté, l'approche de réinitialisation de l'état de notification pour une application sur un appareil est modifiée pour iOS5 une version plus récente.

Cela fonctionne pour moi sur iOS6:

  • Supprimer l'application de l'appareil
  • Définir la date / heure de l'appareil deux jours ou plus à l'avance
  • Redémarrez l'appareil
  • Définir la date / heure de l'appareil deux jours ou plus à l'avance
  • Redémarrez l'appareil
  • Installez et exécutez à nouveau l'application

Cependant, cela ne fera que réapparaître l'invite initiale - cela ne supprimera aucun autre élément lié à l'état push.

micmdk
la source
A travaillé pour moi aussi sur ios7, vous devez changer la date deux fois une fois ne fonctionne pas
Nath
1
Je vous remercie! Cela fonctionne même sur iOS 8 (j'ai dû réinitialiser les autorisations push pour Twitter.app, car il n'avait pas le paramètre "Badges d'icône d'application" dans son volet de préférence dans les paramètres).
gklka
9

Le plist: /private/var/mobile/Library/RemoteNotification/Clients.plist

... contient les clients enregistrés pour les notifications push. La suppression de l'entrée de votre application entraînera la réapparition de l'invite

Erik Johnson
la source
11
réponse inutile si vous développez pour l'App Store
samvermette
20
Si cela est possible pour les jailbreakers, il devrait être possible pour les développeurs de le faire sur un téléphone non jailbreaké, non? Et ce n'est PAS une réponse inutile, car ce n'est pas quelque chose que vous mettriez dans une application pour la soumettre au magasin. C'est aux développeurs de faire pendant le test.
Oscar
1
Ce fichier ne fait pas partie d'iOS 5.x.
gmogames du
Voir une réponse mise à jour dans le cadre de cette question: stackoverflow.com/questions/13021066/…
AriX
7

Le faire par programme semble fonctionner pour moi à chaque fois. J'ai une version avec la ligne suivante non commentée:

 [[UIApplication sharedApplication] unregisterForRemoteNotifications];

Je l'exécute chaque fois que je souhaite me désinscrire de PN. Vous devrez peut-être mettre fin à l'application explicitement à partir de la liste des récents et jouer avec le Centre de notifications dans l'application Paramètres pour bien faire les choses.

En outre, l'invite de l'interface utilisateur demandant à l'utilisateur de s'inscrire à PN peut ne pas s'afficher. Je ne sais pas si a été désactivé dans l'une des versions récentes d'iOS.

dagnytaggart
la source
A travaillé pour moi iOS 10 / iPhone 6S. Notez que j'ai désinscrit, puis supprimé l'application avant de réinstaller.
Gabriel Jensen
5

Comme l'a dit ianolito, fixer la date devrait fonctionner:

Vous pouvez réaliser ce dernier sans attendre réellement un jour en réglant l'horloge système d'un jour ou plus en avant, en éteignant complètement l'appareil, puis en le rallumant.

J'ai remarqué que sur mon appareil (iPhone 4, iOS 6.1.2), le réglage de l'horloge système d' un jour ou même de quelques jours ne fonctionnait pas pour moi. J'ai donc mis la date en avant d' un mois , puis cela a fonctionné et mon application a de nouveau affiché l'invite de notification.

J'espère que cela aidera tout le monde, cela peut être un peu douloureux!

Vincent Cohen
la source
1
Veuillez ne pas répondre avec "Dernier OS" - cela change tout le temps. Ce comportement semble toujours cassé dans la version 6.1.2, mais peut-être a-t-il fonctionné dans la version 6.0.1?
patr1ck
Modifié la réponse, toujours cela en 6.1.2 oui et avant en 6.0.1 aussi. Cela ne fonctionne pour moi que si je fixe au moins la date +1 mois.
Vincent Cohen
1
J'avais également entendu le truc des 24 heures, alors je l'ai essayé et ça n'a pas fonctionné en faisant 2 jours à l'avance. Réglez-le sur 3 mois à partir de maintenant et la fenêtre contextuelle d'autorisation est réapparue! Merci!
marcshilling
Ancien poste mais heureux de voir qu'il est toujours utile! Bonne chance :)
Vincent Cohen
5

Je suis d'accord avec micmdk .. J'avais un environnement de développement configuré avec des notifications push et j'avais besoin d'un moyen de réinitialiser mon téléphone pour qu'il ressemble à une installation initiale ... et seules ces étapes précises ont fonctionné pour moi ... nécessite DEUX redémarrages de l'appareil:

De APPLE TECH DOC:

Réinitialisation de l'alerte d'autorisations de notifications push sur iOS La première fois qu'une application activée par push s'enregistre pour les notifications push, iOS demande à l'utilisateur s'il souhaite recevoir des notifications pour cette application. Une fois que l'utilisateur a répondu à cette alerte, celle-ci n'est plus présentée à moins que l'appareil ne soit restauré ou que l'application ait été désinstallée pendant au moins un jour.

Si vous souhaitez simuler une première exécution de votre application, vous pouvez laisser l'application désinstallée pendant une journée. Vous pouvez réaliser ce dernier sans réellement attendre un jour en suivant ces étapes:

  1. Supprimez votre application de l'appareil.

  2. Éteignez complètement l'appareil et rallumez-le.

  3. Accédez à Paramètres> Général> Date et heure et réglez la date avant un jour ou plus.

  4. Éteignez à nouveau complètement l'appareil et rallumez-le.

lepert
la source
Cela a été mentionné comme ne fonctionnant plus dans une autre réponse.
Beau Nouvelle
Cela fonctionne très bien. Ce qui a cessé de fonctionner dans iOS 5.1, c'est l' ancienne version de cette autre réponse, qui a laissé de côté le redémarrage entre la suppression de l'application et le réglage de l'horloge.
dgatwood
3

Je me suis posé des questions à ce sujet dans le passé et suis arrivé à la conclusion que ce n'était pas en fait un cas de test valide pour mon code. Je ne pense pas que le code de votre application puisse réellement faire la différence entre le fait que quelqu'un refuse les notifications la première fois ou la désactive ultérieurement à partir des paramètres de notification de l'iPhone. Il est vrai que l'expérience utilisateur est différente, mais cela est caché dans l'appel à registerForRemoteNotificationTypes.

L'appel de unregisterForRemoteNotifications ne supprime pas complètement l'application des paramètres de notification - bien que cela supprime le contenu des paramètres de cette application. Ainsi, cela ne provoquera toujours pas la présentation de la boîte de dialogue une deuxième fois à l'utilisateur la prochaine fois que l'application s'exécutera (du moins pas sur la v3.1.3 avec laquelle je teste actuellement). Mais comme je l'ai dit plus haut, vous ne devriez probablement pas vous en préoccuper.

Kharrison
la source
J'espérais une meilleure réponse, mais je suppose qu'il n'y en a tout simplement pas. Merci quand même!
hanno
3

La même note technique que celle mentionnée dans la réponse acceptée ( TN2265 - Dépannage des notifications push) a depuis été mise à jour avec une solution pour iOS 5 et supérieur.

En bref: créez une sauvegarde et restaurez-la à chaque fois.

Sur iOS 5 et versions ultérieures, réinitialisez l'alerte d'autorisations des notifications push en restaurant l'appareil à partir d'une sauvegarde (r. 11450187). Voici les étapes pour le faire efficacement:

  1. Utilisez Xcode Organizer pour installer votre application sur l'appareil. La clé est d'installer l'application pour la première fois sans l'exécuter.
  2. Utilisez iTunes pour sauvegarder l'appareil.
  3. Exécutez l'application. L'alerte des autorisations des notifications push sera présentée.
  4. Lorsque vous souhaitez réinitialiser l'alerte des autorisations des notifications push, restaurez l'appareil à partir de la sauvegarde que vous avez créée à la première étape.
David Rönnqvist
la source
Il aurait peut-être recommandé cela à un moment donné, mais ce n'est plus le cas. La recommandation actuelle est de supprimer l'application, de redémarrer, de régler l'horloge en avant, de redémarrer, de régler éventuellement l'horloge sur la date et l'heure correctes et d'exécuter l'application.
dgatwood
2

La note technique d'Apple décrit également que vous pouvez restaurer l'appareil pour réinitialiser la boîte de dialogue de notification push.

Il ne dit pas que vous pouvez également utiliser l'option "Général -> Réinitialiser -> Effacer tout le contenu et les paramètres" sur l'appareil lui-même (iOS 5.x).

M. Zystem
la source
1
Pour ce que ça vaut: j'ai juste essayé «d'effacer tous les paramètres», et cela n'a pas fonctionné. Essayer tout le contenu et tous les paramètres ...
Groxx
8
Et "tout le contenu et les paramètres" fonctionne effectivement, merci! Mais sainte option nucléaire, Batman! C'est absolument insensé.
Groxx
94
J'ai entendu dire que l'achat d'un nouvel appareil efface également l'avertissement de notification push!
samvermette
J'ai essayé d'acheter un nouvel appareil, mais cela n'a pas fonctionné non plus. Après avoir amené le nouvel appareil dans la barre de génie, ils ont travaillé un peu de magie et réparé pour plus d'argent ... Je suis surpris après tant d'années qu'Apple n'ait toujours pas fourni de moyen pratique et simple de réinitialiser les autorisations push. C'est ridicule
Chris
1

En plus de la réponse d'ianolito.

J'ai eu le même problème avec une application que j'ai téléchargée il y a un an et j'ai refusé initialement la notification push. Maintenant que je veux des notifications push, ces étapes ont fonctionné pour moi sur iOS 7 beta. Je ne sais pas exactement quel (s) point (s) l'a déclenché.

  • Fermez et supprimez l'application.
  • Accédez à vos paramètres iCloud et supprimez l'application d'iCloud. Faites-le sur tous les autres appareils sur lesquels la sauvegarde iCloud des applications est activée. Après avoir désactivé et supprimé, effectuez une nouvelle sauvegarde. L'application ne doit plus être répertoriée sous les sauvegardes. (C'est peut-être pourquoi la note technique d'Apple décrite par ianolito a cessé de fonctionner dans iOS 5, depuis iCloud a été introduit dans iOS 5 et beaucoup ont activé la sauvegarde iCloud pour les applications.)
  • Accédez à vos paramètres d'heure et réglez l'heure plus d'un mois à l'avance.
  • Éteignez l'iPhone (pas de réinitialisation).
  • Attendez une minute, rallumez-le et téléchargez à nouveau l'application.
  • Démarrez l'application et on m'a présenté à nouveau la boîte de dialogue.
  • Activez à nouveau la sauvegarde de l'application, car elle est toujours désactivée. Corrigez l'heure.

Dieu merci, je n'ai pas eu à "Effacer tout le contenu et les paramètres". Peut-être que cela aidera quelqu'un.

Masa
la source
1

J'ai récemment rencontré un problème similaire avec l'application React-native. La version iPhone OS était 13.1 J'ai désinstallé l'application et essayé d'installer l'application et j'ai remarqué que les autorisations de localisation et de notification n'étaient pas demandées.

En vérifiant les paramètres, je pouvais voir que mon application était activée pour l'emplacement (à partir de l'installation précédente), mais il n'y avait pas d'entrée correspondante contre la notification. J'ai essayé de désinstaller et de redémarrer sans régler l'heure, cela n'a pas fonctionné. Btw, j'ai également essayé de télécharger l'application Appstore, toujours le même comportement.

Le problème n'a été résolu qu'après le réglage de l'heure de l'appareil.

RUppal
la source
0

Après des heures de recherche et sans succès avec les suggestions ci-dessus, cela a fonctionné comme un charme pour 3.x +

override func viewDidLoad() {
        super.viewDidLoad()


            requestAuthorization()

}

func requestAuthorization() {

        if #available(iOS 10.0, *) {

            UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { (granted, error) in
                print("Access granted: \(granted.description)")
            }

        } else {
            // Fallback on earlier versions
        }

    }
Felecia Genet
la source