web-dev-qa-db-fra.com

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

Je développe une application avec les notifications Push. Pour vérifier toutes les possibilités 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. 

La boîte de dialogue (initiée par registerForRemoteNotificationTypes) ne s'affiche toutefois qu'une fois par application. Comment réinitialiser la mémoire de l'iPhone OS de mon application. Supprimer l'application et réinstaller n'aide pas. 

167
hanno

Note technique TN2265: Résolution des problèmes liés aux notifications push

La première fois une application compatible Push s'enregistre pour les notifications Push, iOS demande à l'utilisateur s'il souhaite recevoir notifications pour cette application. Une fois la l’utilisateur a répondu à cette alerte c’est non présenté à nouveau à moins que l'appareil est restauré ou l'application a été désinstallé pendant au moins une journée.

Si vous voulez simuler une première fois lancez votre application, vous pouvez la quitter désinstallé pendant un jour. Vous pouvez atteindre ce dernier sans réellement attendre un jour en réglant l'horloge système transmettre un jour ou plus, en tournant le éteignez complètement l'appareil, puis tournez l'appareil en marche.

Mise à jour: Comme indiqué dans les commentaires ci-dessous, cette solution a cessé de fonctionner depuis iOS 5.1. J'encourage le dépôt d'un bogue avec Apple afin qu'ils puissent mettre à jour leur documentation. La solution actuelle semble 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. Supprimer votre application de l'appareil.
  2. Éteignez complètement l'appareil, puis rallumez-le.
  3. Allez dans Paramètres> Général> Date et heure et définissez la date d'un jour ou plus.
  4. Éteignez complètement l'appareil, puis rallumez-le.

UPDATE à partir de iOS 9

Si vous supprimez et réinstallez simplement l'application, l'état de la notification sera réinitialisé à notDetermined (ce qui signifie que des invites apparaîtront).

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

297
ianolito

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

47
capikaw

Sur iOS 9.0.2, je reçois l '"alerte de notification Push Push" à chaque fois que je supprime l'application et la réinstalle. Cela est vrai pour les téléchargements de production AppStore et le mode ad hoc.

UPDATE: Il est confirmé que cela fonctionne pour iOS 9.x

35
Gomfucius

Comme indiqué précédemment, l'approche utilisée pour réinitialiser l'état de notification d'une application sur un périphérique est modifiée pour iOS5 et pour une version plus récente.

Cela fonctionne pour moi sur iOS6:

  • Supprimer l'application de l'appareil
  • Définir la date et l'heure de l'appareil deux jours ou plus à l'avance
  • Redémarrer l'appareil
  • Définir la date et l'heure de l'appareil deux jours ou plus à l'avance
  • Redémarrer l'appareil
  • Installer et exécuter l'application à nouveau

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

19
micmdk

La plist: /Private/var/mobile/Library/RemoteNotification/Clients.plist

... contient les clients enregistrés pour les notifications Push. Si vous supprimez l'entrée de votre application, l'invite réapparaîtra.

9
Erik Johnson

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

 [[UIApplication sharedApplication] unregisterForRemoteNotifications];

Je le lance chaque fois que je veux me désinscrire de PN. Vous devrez peut-être fermer l'application explicitement à partir de la liste des articles récents et vous amuser avec l'application Notification Center dans Paramètres pour obtenir les bons résultats.

De plus, l'invite d'interface utilisateur demandant à l'utilisateur de s'inscrire pour le PN peut ne pas s'afficher. Pas sûr si a été désactivé dans l'une des versions récentes iOS.

7
dagnytaggart

Je suis d'accord avec micmdk .. J'avais une configuration d'environnement de développement avec 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écessitent 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, il n'est plus présenté à moins que le périphérique ne soit restauré ou que l'application ne soit désinstallée depuis au moins un jour.

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

  1. Supprimer votre application de l'appareil.

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

  3. Allez dans Paramètres> Général> Date et heure et définissez la date d'un jour ou plus.

  4. Éteignez complètement l'appareil, puis rallumez-le.

5
lepert

Comme le disait ianolito, fixer la date devrait fonctionner: 

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

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

J'espère que ça aide pour tout le monde, ça peut être un peu douloureux à la tête! 

5
Vincent Cohen

Je me suis déjà posé cette question par le passé et suis parvenu à la conclusion que ce n'était pas réellement un test élémentaire valable pour mon code. Je ne pense pas que votre code d'application puisse réellement faire la différence entre une personne refusant des notifications la première fois ou une désactivation ultérieure des paramètres de notification de l'iPhone. Il est vrai que l'expérience utilisateur est différente mais elle est cachée dans l'appel à registerForRemoteNotificationTypes.

L'appel de unregisterForRemoteNotifications ne supprime pas complètement l'application des paramètres de notification, bien qu'il supprime le contenu des paramètres de cette application. Cela n'entraînera donc toujours pas une deuxième présentation de la boîte de dialogue à l'utilisateur lors de la prochaine exécution de l'application (du moins pas avec la v3.1.3 avec laquelle je teste actuellement). Mais comme je le dis plus haut, vous ne devriez probablement pas vous inquiéter de cela.

3
kharrison

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 versions ultérieures.

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

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

  1. Utilisez l'organisateur Xcode 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. Lancer l'application. L'alerte des autorisations de notifications Push sera présentée.
  4. Lorsque vous souhaitez réinitialiser l'alerte d'autorisations de notifications Push, restaurez le périphérique à partir de la sauvegarde créée à la première étape.
3
David Rönnqvist

La note technique Apple a également décrit la possibilité de restaurer le périphérique pour réinitialiser la boîte de dialogue Notification push.

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

2
Mr. Zystem

En plus de la réponse de ianolito.

Avait le même problème avec une application que j'ai téléchargée il y a un an et refusant initialement la notification Push. Désirant maintenant récupérer les notifications Push, ces étapes ont fonctionné pour moi sur iOS 7 bêta. Je ne sais pas quel (s) point (s) l’a déclenchée exactement.

  • Fermez et supprimez l'application.
  • Accédez à vos paramètres iCloud et supprimez l'application de iCloud. Faites-le sur tous les autres appareils sur lesquels iCloud Backup for Apps est activé. Après la désactivation et la suppression, effectuez une nouvelle sauvegarde. L'application ne doit plus figurer dans les sauvegardes. (C’est peut-être pour cette raison que la note technique d’Apple décrite par ianolito a cessé de fonctionner sous iOS 5, car iCloud a été introduit dans iOS 5 et que la sauvegarde d’iCloud pour les applications est souvent activée.)
  • Accédez à vos paramètres de temps et réglez-le à plus d'un mois. 
  • Éteignez l'iPhone (pas de réinitialisation).
  • Attendez une minute, rallumez-le et téléchargez à nouveau l'application. 
  • Démarrez l'application et la boîte de dialogue m'a été présentée à nouveau. 
  • Activez à nouveau la sauvegarde de l'application, car elle est toujours désactivée. Corrige le temps.

Dieu merci, je n'ai pas eu à "effacer tout le contenu et les paramètres". Cela aidera peut-être quelqu'un.

1
Masa

Après des heures de recherche et aucune chance des 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
        }

    }
0
Felecia Genet