Une fois créé, le jeton d'appareil de notification push change-t-il jamais?
Exemple de mise à jour de l'application? ou dans tout autre cas cela peut changer ??
Une fois créé, le jeton d'appareil de notification push change-t-il jamais?
Exemple de mise à jour de l'application? ou dans tout autre cas cela peut changer ??
Réponses:
Depuis [Apple Documentation ApplePushService] 2
La forme de cette phase de confiance de jeton garantit que seuls les APN génèrent le jeton qu'il honorera plus tard, et il peut s'assurer qu'un jeton qui lui est remis par un appareil est le même que celui qu'il avait précédemment provisionné pour cet appareil particulier - et uniquement pour cet appareil.
Si l'utilisateur restaure les données de sauvegarde sur un nouveau périphérique ou réinstalle le système d'exploitation, le jeton de périphérique change.
La documentation officielle d'Apple n'est pas claire sur ce point. Ce que j'ai observé est le suivant: le jeton est invariant pour un appareil, une application et un domaine donnés (production vs sandbox). Je pense que cela doit rester vrai pour que le système fonctionne de manière fiable. Considérez la situation dans laquelle une mise à jour d'application déclenche un nouveau jeton APN; si j'utilisais la meilleure nouvelle application de type Twitter, avec les notifications activées, que se passerait-il lorsque je mettrais à jour mon application à partir d'iTunes? Dois-je m'attendre à ce qu'il continue à recevoir des notifications même si je n'ai pas exécuté les applications depuis que je «synchronise» la mise à jour sur mon appareil? Le fait de modifier l'application ne peut pas affecter le système APN car le système d'exploitation peut recevoir des notifications en votre nom même si vous n'avez pas exécuté l'application mise à jour.
Pour être clair, Apple déclare "Une application doit s'enregistrer [auprès des serveurs APN] à chaque fois qu'elle se lance et donner à son fournisseur le jeton actuel". Je suis entièrement d'accord; cela protégera votre application de mauvaises hypothèses ou de situations inhabituelles.
L'une des réponses à Les jetons de notification push sont-ils uniques dans toutes les applications pour un seul appareil? indique que les jetons de périphérique sont uniques par "installation du système d'exploitation"; et que la restauration à partir d'une sauvegarde vers un périphérique conserverait le jeton, mais l'effacement d'un périphérique lui ferait obtenir un nouveau jeton. Cela serait tout à fait conforme aux intentions d'Apple en matière de fonctionnement transparent et de confidentialité: l'effacement d'un appareil est suffisamment grave pour justifier peut-être une nouvelle association, mais un utilisateur qui restaure une image après une mise à jour du système d'exploitation voudrait conserver ses notifications existantes. Si je me souviens de la récente mise à jour iOS5 sur mon iPad, j'ai restauré la sauvegarde la plus récente après la mise à niveau, ce qui aurait maintenu la cohérence de mon jeton de notification. [Modifier: restaurer une sauvegarde sur un autre l'appareil ne dupliquera PAS le jeton.]
mise en garde: je n'ai pas de connaissances définitives sur le sujet, juste une expérience raisonnable de travail avec APN (en tant que développeur tiers). Comme toujours, il est préférable de vérifier vos hypothèses.
J'ai récemment eu la chance de> parler aux ingénieurs Apple et de faire quelques tests dans le monde réel, et je voulais présenter les résultats:
Pour être complet, lorsque je parle de renvoyer un jeton APN, je suppose le contexte d'un seul identifiant / application de bundle.
Premièrement, les ingénieurs Apple ont déclaré qu'il ne devrait pas être possible pour deux appareils de renvoyer le même APN. Nonobstant les commentaires ci-dessous, je n'ai pas été en mesure d'identifier une circonstance où cela échoue.
Deuxièmement, voici la séquence de test de mise à niveau et les résultats:
Commencez avec iOS4 installé sur iPhone4; périphérique de sauvegarde dans iTunes
Mettre à niveau vers iOS5
À partir d'un test précédent, je sais que le jeton APN est maintenant différent
Restaurer la sauvegarde sur le périphérique
Le jeton APN est désormais identique à l'étape 1.
Réinitialiser iOS (appareil propre)
Le jeton APN change
Sauvegardez un téléphone différent sur iTunes et restaurez cette sauvegarde sur l'appareil de test; en gros, je restaure la "mauvaise" sauvegarde, comme si je changeais de téléphone.
Le jeton APN change à nouveau; en outre, il est distinct et ne correspond pas aux jetons ni au jeton d'origine ni au jeton "cloné".
Restaurez la sauvegarde «correcte» sur le périphérique.
Le jeton APN est maintenant identique à l'étape 1.
Enfin, j'ai mis à niveau le téléphone vers iOS6 (beta2), restauré ma sauvegarde et retesté. Comme prévu, le jeton a continué à correspondre au jeton à l'étape 1.
À ce stade, je suis assez convaincu que les jetons APN ne peuvent pas être dupliqués entre différents appareils; peut-être que cela s'est produit en tant que bogue dans les versions antérieures d'iOS, mais je suis convaincu qu'iOS5 (et probablement iOS6) gère correctement les jetons APN.
Je viens de réaliser que je n'avais pas ajouté ceci: les jetons d'appareils vont changer. Un des développeurs Apple a partagé avec moi que les jetons expirent réellement (après 2 ans, je pense). Pour de nombreuses raisons, cela est suffisamment long pour pouvoir être considéré comme invariant.
[Je ne suis pas inquiet si je dois mettre à jour mes scripts de test avec de nouveaux jetons tous les deux ans, d'autant plus que je change de téléphone chaque année.]
Je viens de le tester avec les changements de jetons iOS9 et APN Push si je réinstalle une application.
OUI , les jetons d'appareils peuvent changer.
Chaque fois que votre application reçoit un jeton, elle doit le stocker. Ensuite, chaque fois qu'un nouveau jeton est reçu (ce qui se produira éventuellement), comparez le nouveau jeton au jeton stocké et, s'ils sont différents:
nil
)En pratique, la dernière étape est la plus susceptible d'être non triviale. Par exemple, si vous avez un service qui envoie des alertes météo à un jeton d'appareil en fonction du code postal auquel cet appareil s'est abonné, vous devez transmettre le old_token
et le new_token
audit service afin qu'il puisse mettre à jour la livraison.
Ergo, d'une manière générale, 100% des API acceptant un "jeton d'appareil" doivent également avoir une sorte de fonctionnalité UPDATE
pour ce jeton. Pour ne pas construire pour cela est de construire pour livrés et mis-notifications non livrées.
Le jeton d'appareil change depuis iOS 8 et les versions ultérieures
Veuillez consulter le texte ci-dessous sur le site Web d'Apple. Enregistrement, planification et gestion des notifications utilisateur
Le jeton d'appareil est votre clé pour envoyer des notifications push à votre application sur un appareil spécifique. Les jetons d'appareil peuvent changer, votre application doit donc se réenregistrer à chaque fois qu'elle est lancée et transmettre le jeton reçu à votre serveur. Si vous ne parvenez pas à mettre à jour le jeton de l'appareil, les notifications à distance risquent de ne pas parvenir à l'appareil de l'utilisateur. Les jetons de périphérique changent toujours lorsque l'utilisateur restaure les données de sauvegarde sur un nouveau périphérique ou ordinateur ou réinstalle le système d'exploitation. Lors de la migration de données vers un nouvel appareil ou ordinateur, l'utilisateur doit lancer votre application une fois avant que les notifications à distance puissent être envoyées à cet appareil.
Je pense qu'il vaut la peine de mentionner que personne ne l'a fait que le jeton change après que vous ayez appelé unregisterForRemoteNotifications
. Lorsque vous appelez la registerForRemoteNotifications
prochaine fois, le jeton est différent. Je n'ai trouvé aucune confirmation de cela dans les documents Apple, mais j'ai moi-même été témoin d'un tel comportement. Veuillez garder cela à l'esprit
Cela ne devrait pas changer, à moins que votre application ne soit restaurée sur un nouvel appareil (à quel point il ne sera pas invité à accepter à nouveau les notifications push et vous enverra simplement l'appel enregistré à quel point vous devriez accepter le nouveau jeton).
Mais Apple ne garantit pas qu'il ne change jamais (donc la documentation ne le mentionne jamais). Vous feriez mieux de programmer le pire et de supposer que cela pourrait changer un jour. En outre, l'envoi d'un jeton à votre serveur vous permet régulièrement de supprimer des jetons qui ne sont pas enregistrés depuis un certain temps et qui ont probablement désinstallé votre application ou perdu tout intérêt il y a quelque temps (et la documentation spécifie cela comme un comportement souhaité!).
De - Apple Docs
Les APN peuvent émettre un nouveau jeton d'appareil pour diverses raisons:
L'utilisateur installe votre application sur un nouvel appareil
L'utilisateur restaure l'appareil à partir d'une sauvegarde
L'utilisateur réinstalle le système d'exploitation
Autres événements définis par le système
Par conséquent, les applications doivent demander le jeton d'appareil au moment du lancement.
Aditionellement:
IMPORTANT
Les jetons de périphérique APN sont de longueur variable. Ne codez pas leur taille en dur.
Les liens deviennent rapidement obsolètes avec Apple! donc je cite ce qui semble être assez clair maintenant:
Ne mettez jamais en cache les jetons de périphérique dans votre application; à la place, récupérez-les du système lorsque vous en avez besoin. Les APN émettent un nouveau jeton d'appareil sur votre application lorsque certains événements se produisent. Le jeton d'appareil est garanti différent, par exemple, lorsqu'un utilisateur restaure un appareil à partir d'une sauvegarde, lorsque l'utilisateur installe votre application sur un nouvel appareil et lorsque l'utilisateur réinstalle le système d'exploitation. La récupération du jeton, plutôt que de compter sur un cache, garantit que vous disposez du jeton d'appareil actuel nécessaire à votre fournisseur pour communiquer avec les APN. Lorsque vous tentez de récupérer un jeton d'appareil mais qu'il n'a pas changé, la méthode fetch retourne rapidement.
En référence aux notifications push Apple
Le jeton d'appareil est votre clé pour envoyer des notifications push à votre application sur un appareil spécifique. Les jetons d'appareil peuvent changer, votre application doit donc se réenregistrer à chaque fois qu'elle est lancée et transmettre le jeton reçu à votre serveur. Si vous ne parvenez pas à mettre à jour le jeton de l'appareil, les notifications à distance risquent de ne pas parvenir à l'appareil de l'utilisateur. Les jetons de périphérique changent toujours lorsque l'utilisateur restaure les données de sauvegarde sur un nouveau périphérique ou ordinateur ou réinstalle le système d'exploitation. Lors de la migration de données vers un nouvel appareil ou ordinateur, l'utilisateur doit lancer votre application une fois avant que les notifications à distance puissent être envoyées à cet appareil.
Ne mettez jamais en cache un jeton d'appareil; obtenez toujours le jeton du système chaque fois que vous en avez besoin. Si votre application s'est précédemment enregistrée pour les notifications à distance, le fait d'appeler à nouveau la méthode registerForRemoteNotifications n'entraîne aucune surcharge supplémentaire, et iOS renvoie immédiatement le jeton d'appareil existant à votre délégué d'application. En outre, iOS appelle votre méthode de délégué à chaque fois que le jeton d'appareil change, pas seulement en réponse à l'enregistrement ou au réenregistrement de votre application.
Selon ce lien, le jeton d'appareil
Le jeton d'appareil inclus dans chaque demande représente l'identité de l'appareil recevant la notification. Les APN utilisent des jetons d'appareil pour identifier chaque combinaison d'appareil et d'appareil unique. Il les utilise également pour authentifier le routage des notifications à distance envoyées à un appareil. Chaque fois que votre application s'exécute sur un appareil, elle récupère ce jeton auprès des APN et le transmet à votre fournisseur. Votre fournisseur stocke le jeton et l'utilise lors de l'envoi de notifications à cette application et à cet appareil particuliers. Le jeton lui-même est opaque et persistant et ne change que lorsque les données et les paramètres d'un appareil sont effacés. Seuls les APN peuvent décoder et lire un jeton d'appareil.
Oui, cela peut changer. Idéalement, chaque fois que nous recevons un jeton via la méthode de rappel
- (void) application: (UIApplication *) application didRegisterForRemoteNotificationsWithDeviceToken: (NSData *) deviceToken
L'application doit enregistrer / actualiser le jeton sur le serveur distant. Cela garantira que le jeton sur l'APNS et votre serveur sont synchronisés.
Selon la documentation Apple ,
L'obtention et la gestion d'un jeton d'appareil spécifique à une application fonctionnent comme suit:
Votre application s'enregistre auprès des APN pour les notifications à distance Lorsqu'un nouveau jeton d'appareil est nécessaire, les APN en génèrent un à l'aide des informations contenues dans le certificat de l'appareil. Il crypte le jeton à l'aide d'une clé de jeton et le renvoie à l'appareil, comme indiqué dans la flèche du milieu pointant vers la droite. Le système renvoie le jeton d'appareil à votre application en appelant votre application: didRegisterForRemoteNotificationsWithDeviceToken: méthode de délégué. Lors de la réception du jeton, votre application (dans la méthode déléguée) doit le transmettre à votre fournisseur au format binaire ou hexadécimal. Votre fournisseur ne peut pas envoyer de notifications à l'appareil sans ce jeton. Pour plus de détails, voir Inscription pour recevoir des notifications à distance dans Configuration de la prise en charge des notifications à distance.
Le jeton d'appareil relaie l'installation de l'application.
Cela signifie que si vous réinstallez l'application, elle change ; cela ne marche pas si vous le faites à partir d'une sauvegarde, d'une mise à niveau iOS, etc.
La bonne façon de l'utiliser, pour éviter tout problème, est d'obtenir celle donnée NSPAppDelegate
à chaque lancement d'application, dans la méthodedidRegisterForRemoteNotificationsWithDeviceToken