web-dev-qa-db-fra.com

Apple Push Notification Service - Plusieurs jetons de périphérique sont valables pour le même périphérique

Pour que nous puissions envoyer aux utilisateurs des notifications iOS, le flux suivant se produit: un utilisateur installe notre application, s’enregistre auprès de APNS et envoie le jeton d’enregistrement à notre serveur pour qu’il soit utilisé ultérieurement pour envoyer des notifications.

Le processus ci-dessus est répété pour chaque appareil sur lequel l'utilisateur installe notre application; nous aimerions qu'ils reçoivent des notifications sur tous leurs appareils.

En outre, le processus est répété lorsqu'un utilisateur désinstalle notre application et réinstalle le même appareil.

Chaque fois que le processus se répète, nous obtenons un nouveau jeton d'enregistrement distinct. C'est très bien, cependant, nous avons remarqué que ce n'est que récemment que, lorsque notre application est désinstallée, le jeton de périphérique reste valide après sa réinstallation et qu'un nouveau jeton est généré. Nous croyons comprendre qu’un seul jeton unique peut exister pour un périphérique.

La documentation d'Apple semble le suggérer également ( https://developer.Apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ApplePushService.html#//Apple_ref/doc/uid/TP4194-CH100. -SW12 )

La forme de cette phase de confiance de jeton garantit que seuls les APN génèrent le jeton qu’elle honorera par la suite, et elle peut s’assurer qu’un jeton qui lui est remis par un périphérique est identique à celui qu’il a précédemment fourni pour ce périphérique particulier - et uniquement. pour cet appareil.

Lorsqu'un nouveau jeton est généré après la réinstallation et envoyé à notre backend, nous avons deux jetons de périphérique qui pointent vers le même périphérique et, par conséquent, nous envoyons plusieurs notifications à ce périphérique. Est-ce que nous comprenons mal la documentation? Si tel est le cas, quelle est la manière habituelle de gérer le scénario de réinstallation?

Merci!

31
Jordan

Nous venons de faire un test ici. Sur notre appareil de test iOS 8.4.1 après la réinstallation de notre application, nous avons reçu le même jeton, alors que sur iOS 9.1, nous recevons toujours un nouveau jeton après la réinstallation. Cela ne poserait pas de problème si APNS invalide les anciens jetons de périphérique, mais pour autant que je sache, cela n’est pas le cas. Le résultat est que nous envoyons des notifications en double à nos utilisateurs vers le même appareil. Peut-être que cela prend un peu de temps pour invalider un jeton plus ancien?

Nous avons décidé de résoudre ce problème côté serveur et de supprimer les jetons en double pour un utilisateur de notre base de données. Ce n'est pas une bonne solution permanente, mais une solution à court terme pour nous puisque nos utilisateurs utilisent l'application généralement sur un seul appareil.

9
ersjoh

Nous avons le même problème: nous avons trouvé 2 jetons de périphérique valides pour 1 périphérique . Cependant, lorsque nous avons essayé de vérifier que "la désinstallation et la réinstallation généreraient un nouveau jeton de périphérique et que le jeton de périphérique précédent était toujours valide", résultat opposé . À savoir, le nouveau jeton de périphérique a été généré, mais l'ancien jeton de périphérique est devenu invalide . J'ai vérifié cette information le 3/9/2016 et le 3/10/2016.

Pas sûr si Apple a corrigé ce bogue partiellement :

a) lorsque l'application est désinstallée et réinstallée, l'ancien deviceToken devient invalide. (pas de nouveaux numéros)

b) les jetons de périphérique en cours de validité resteront valables. (les anciens problèmes ne peuvent pas être corrigés, le périphérique recevra toujours plusieurs notifications de chaque jeton de périphérique valide)

On dirait que nous devrons utiliser "identifierForVendor" pour distinguer un périphérique unique: Nettoyer notre table d'enregistrement (et ne conserver que le dernier deviceToken) si nous voyons 2 deviceTokens partager le même identifiantForVendor.

1
Longfei Wu

Oui, je vois un seul appareil avec la même application (mon application), qui a reçu différents APNS au cours de sa courte durée de vie, dont beaucoup sont encore capables de recevoir une notification Push (du serveur de production APNS).

La solution facile serait simplement d’avoir notre service d’envoi APNS principal pour honorer uniquement le dernier jeton APNS reçu. Cela est faisable, en supposant qu'il existe une autre clé primaire unique pour chaque périphérique iOS. Eh bien, étant donné que l’UUID n’est plus disponible, nous devons alors nous fier à l’ID fournisseur Apple. Ce problème avec l'ID de fournisseur Apple est que la valeur peut également changer au fil du temps, alors assurez-vous de tenir compte de cela.

Nous n'envoyons actuellement que des notifications Push aux appareils qui ont notre identifiant de membre/utilisateur unique. Ceci est connu de notre application, une fois qu'un utilisateur s'est connecté à notre application. Nous pourrions donc utiliser notre ID membre/utilisateur, mais si un membre/utilisateur dispose de plusieurs périphériques, cela signifie que si nous utilisons la dernière valeur de jeton APNS comme gagnant, un même membre ne peut PAS avoir plusieurs périphériques iOS recevant des notifications Push. (Pensez iPad et iPhone, assez commun de nos jours).

Cela dit, lorsque la haute direction veut envoyer des notifications Push à des périphériques sur lesquels aucun membre/utilisateur unique n'est réellement connecté, il existe un risque de traversée des flux. 

1
evermeire

"Chaque fois que le processus se répète, nous obtenons un nouveau jeton d'enregistrement distinct". 

Êtes-vous sûr de cela? 100% sûr? 

D'après mon expérience, si vous désinstallez l'application, réinstallez-la puis 99,99% du temps, vous obtiendrez le même jeton de périphérique. Si vous recevez un nouveau jeton de périphérique unique à chaque fois que vous désinstallez puis réinstallez l'application, c'est quelque chose que je n'ai jamais vu depuis plusieurs années et plusieurs applications. D'où peut-être que quelque chose d'étrange se passe.

Il y a des cas où un nouveau jeton de périphérique sera généré mais ils sont rares, êtes-vous sûr de ne pas faire autre chose entre la désinstallation/la réinstallation?

P.S. éliminez ce facteur de vos observations - c’est-à-dire, assurez-vous de ne pas installer un build de prod, puis le désinstaller et réinstaller un build de développement ou vice-versa. Même si vous faites cela, le nombre total de jetons de développement uniques ne sera toujours que de deux (bien qu'un seul soit valide par environnement).

0
Gruntcakes