Le jeton d'appareil APNS change-t-il une fois créé?


99

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 ??


Assurez-vous de voir cette réponse car elle fournit de la documentation à 4 endroits où le jeton de périphérique change
Honey

Réponses:


71

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 actuelle a supprimé la dernière phrase. Il semble (d' une autre question SO, stackoverflow.com/questions/2751481/... ) que la restauration des données se retenir sera réinitialiser les jetons APN mais que OS installe et « lingettes » (sauf si elles sont suivies par la restauration des données à l'exploitation nouvellement installé système).
Robert Altman

1
@RobertAltman - Je ne pense pas que ce soit toute l'histoire. J'ai vu un certain nombre d'enregistrements dans notre base de données à partir d'appareils complètement différents avec exactement le même jeton APNS. Je vois en ce moment devant moi un iPad 2 et un iPhone 3GS qui nous ont envoyé le même jeton. Quelqu'un d'autre peut-il confirmer ce comportement?
DougW

@DougW, c'est étrange. Avez-vous toujours un problème similaire? Modification du lien et publication des derniers documents.
iosCurator

139

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.


Mise à jour (juin 2012):

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:

  1. Commencez avec iOS4 installé sur iPhone4; périphérique de sauvegarde dans iTunes

  2. Mettre à niveau vers iOS5
    À partir d'un test précédent, je sais que le jeton APN est maintenant différent

  3. Restaurer la sauvegarde sur le périphérique
    Le jeton APN est désormais identique à l'étape 1.

  4. Réinitialiser iOS (appareil propre)
    Le jeton APN change

  5. 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é".

  6. Restaurez la sauvegarde «correcte» sur le périphérique.
    Le jeton APN est maintenant identique à l'étape 1.

  7. 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.


Mise à jour (août 2012)

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.]


cela signifie-t-il que vous pouvez utiliser le jeton pour identifier de manière unique un utilisateur? (ce qui est très pratique dans les applications où il faut «voter»?). Je peux imaginer la situation: les utilisateurs votent et l'application répond avec un nombre aléatoire via les notifications. Ce numéro doit être renvoyé au serveur pour que le vote soit valide. De cette façon, le vote ne peut pas être truqué facilement.
Toad

également intéressant: le jeton change-t-il lors de la suppression de l'application et de sa réinstallation. Ou est-ce similaire à l'option `` restaurer une sauvegarde ''
Toad

@Toad Le jeton ne changera pas à la suite de la suppression et de la réinstallation d'une application.
Robert Altman

@Toad Je ne pense pas que ce serait une bonne forme d'identification de l'utilisateur; étant donné que le jeton est unique par appareil (ainsi que par application), un utilisateur avec plusieurs appareils aura plusieurs jetons.
Robert Altman

1
Je m'interroge sur la relation entre les certificats et le jeton d'appareil. si le certificat .p12 expire, vous devez modifier le nouveau certificat. J'ai trouvé une référence "Lorsqu'un nouveau jeton d'appareil est nécessaire, les APN en génèrent un en utilisant les informations contenues dans le certificat de l'appareil." Il n'y a donc pas de possibilité d'actualisation du jeton de l'appareil lors du changement de certificats?
illusionJJ


22

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:

  1. Mettre à jour le stockage local de l'appareil (y compris éventuellement nil)
  2. Mettez à jour tout ce qui se trouve sur l'appareil qui utilise le jeton pour être au courant du nouveau jeton
  3. Mettez à jour toutes les API qui ont connaissance de ce jeton vers le nouveau jeton.

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_tokenet le new_tokenaudit 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é UPDATEpour ce jeton. Pour ne pas construire pour cela est de construire pour livrés et mis-notifications non livrées.


ça sonne bien, mais qu'est-ce que j'ai supprimé et réinstallé mon application? dans ce scénario, le jeton d'appareil que j'ai enregistré dans le stockage local sera supprimé
Kuf

@Kuf, avez-vous obtenu une réponse à cette question? J'ai la même chose - même si l'application est désinstallée / réinstallée, comment comparerions-nous le jeton système?
nkirkes

@nkirkes voir cette question pour plus de détails
Kuf

Les trois points «Update» dont vous avez parlé, sont-ils des responsabilités d'iOS, du SDK ou de nous-mêmes?
somenickname

7

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.


2
L'URL est morte! Regle-le, s'il te plait.
Ramis


4

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 registerForRemoteNotificationsprochaine 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


3

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é!).


Vous avez raison: vous ne pouvez pas supposer que le jeton est permanent; suivre les règles d'engagement telles que définies dans la documentation APN. En fait, les développeurs Apple m'ont dit que le jeton allait éventuellement changer (après environ 2 ans).
Robert Altman

1
Ressusciter une vieille discussion, mais quelqu'un pourrait trouver cela utile: j'ai passé du temps cette semaine à travailler sur un serveur d'analyse auto-hébergé et à avoir des problèmes de test - il s'avère que chaque fois que j'ai actualisé mon application de développement (alors que je faisais un nombre de changements UX également), l'ID du jeton a changé à chaque installation du logiciel ... n'est-ce pas trop amusant? (soupir)
ChrisH

3

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.


2

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.

De ce guide


0

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.


0

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.


0

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.


0

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.