5

Je récupère avec succès les données de retour Apple APNS via PHP. La structure que je reçois (après un traitement) ressemble à quelque chose comme ceci:HOWTO supprimer les jetons de périphériques reçus par Apple APNS commentaires

horodatage

jeton dispositif

Ma question est de savoir comment savoir lequel des jetons d'appareil dois-je retirer de ma base de données et d'arrêter envoyer des notifications à eux.

Regardz,

Mlado

Répondre

10

Tous les appareils sont donnés par les commentaires 'échoué' et doivent être supprimés. Aucune rétroaction signifie qu'aucun appareil ne doit être retiré. Il est recouvert sur la documentation Apple:

Apple APN Documentation

+1

Cela ne signifie pas que l'application a été désinstallée de l'appareil, il se peut juste que l'utilisateur n'a pas de connexion wifi persistant pour le moment. – Mladen

+1

Ce n'est pas ce que dit la documentation. "Si un fournisseur tente de fournir une notification push à une application, mais que l'application n'existe plus sur le périphérique, le périphérique signale ce fait au service de notification push Apple. Cette situation se produit souvent lorsque l'utilisateur a désinstallé l'application. un périphérique signale des tentatives de livraison échouées pour une application, les APN ont besoin d'un moyen d'informer le fournisseur afin qu'il puisse s'abstenir d'envoyer des notifications à ce périphérique. " – Lee

+5

@Mladen. Incorrect. Si l'appareil n'a pas de connexion wifi ou 3/4G, Apple enverra la notification push plus tard quand il y aura une connexion. – midspace

-1

Vous devez stocker des appareils avec leur appareil jeton de données, et vous pouvez trouver ces appareils en fonction de leurs jetons d'appareil. Vous pouvez utiliser un jeton de périphérique pour identifier chaque périphérique. Que serait facile de trouver et de changer leurs statuts dans votre DB.

11

L'horodatage est l'élément crucial ici. L'horodatage envoyé par Apple indique la dernière fois que le service Push a tenté de remettre un message à l'appareil et a trouvé que l'application devait être désinstallée. Si l'appareil s'est réenregistré avec votre service depuis, il n'est pas nécessaire de le supprimer. Par conséquent, à chaque fois que votre application charge et envoie le jeton à votre service, vous devez enregistrer l'heure dans votre magasin de données. Lorsque vous exécutez des commentaires, vous devez vérifier l'heure d'Apple et la comparer à l'heure à laquelle vous avez reçu une mise à jour depuis l'application sur l'appareil. Si l'heure à laquelle Apple envoie est plus récente que l'heure à laquelle vous avez reçu une mise à jour, vous devez supprimer (ou désactiver) l'appareil. Si l'heure d'Apple est antérieure, vous n'avez pas besoin de la supprimer car l'utilisateur a réinstallé l'appareil depuis qu'Apple a tenté de le faire.

0

neat explication @argon, mais j'ai une autre question sur l'horodatage.

Chaque fois qu'une application active la notification push, le jeton de périphérique est envoyé au serveur. Dois-je prendre l'horodatage de mon serveur comme étant persisté avec le jeton de périphérique comme didRegisterForRemoteNotificationsWithDeviceToken ne donne que deviceToken et non l'heure. Si mon serveur s'exécute dans un fuseau horaire différent et que APNS s'exécute à un fuseau horaire différent, l'heure d'enregistrement stockée (avec le jeton de périphérique) ne peut pas être comparée à l'horodatage reçu du retour APNS pour vérifier la séquence de register -> uninstall -> reregister.

Je suppose que l'horodatage de la réponse APNS est en UTC et que l'horodatage que le serveur stocke avec le jeton de périphérique doit être converti en UTC avant de stocker l'horodatage ISO. De cette façon, l'horodatage sera dans le même fuseau horaire et la vérification des différences sera cohérente.

s'il vous plaît clarifient

+0

C'est exact, c'est un horodatage UTC donc vous devriez stocker les valeurs UTC dans votre magasin. Référence: [Dernier tableau sous "Service de commentaires"] (https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/CommunicatingWIthAPS.html#//apple_ref/doc/uid/ TP40008194-CH101-SW3) – argon

0

@fyasar,

donc votre recommandation est de stocker le jeton de dispositif contre ID du périphérique (ou une clé). Lorsqu'un message est reçu pour un jeton de périphérique, supprimez cette ligne de jeton de périphérique de la base de données, n'est-ce pas? Si vous avez bien compris, cela ne fonctionnerait pas dans le cas où l'utilisateur installe l'application, la désinstalle, puis l'installe à nouveau dans un court laps de temps et le service de retour n'a été interrogé qu'après que tout ceci se soit produit.Dans ce cas, si l'horodatage dans le commentaire n'est pas pris en compte, le jeton de périphérique sera supprimé, ce qui est incorrect car l'utilisateur a de nouveau installé l'application et l'a réenregistrée pour la notification push.

Ma question est la suivante, comme suggéré dans Apple doc et de nombreux blogs, sur l'enregistrement, quand le jeton de l'appareil est persistant, l'horodatage doit être conservé avec lui. Quelle heure ISO de fuseau horaire doit être conservée ou quel est le fuseau horaire sur lequel le service de retour renvoie l'horodatage.

0

Un horodatage (en tant que valeur time_t de quatre octets) indiquant quand les APN ont déterminé que l'application n'existe plus sur le périphérique. Cette valeur, qui est dans l'ordre du réseau, représente les secondes écoulées depuis minuit le 1er janvier 1970 UTC.

vous pouvez le comparer avec la dernière fois d'insertion de votre table puis retirez le jeton non valide de db, Dans mon cas, je suis en utilisant MySQL et PHP pour le côté sever

$sql="SELECT insert_time from device_tokens ORDER BY insert_time DESC LIMIT 1"; 

il retournera la dernière fois mis à jour de db puis-je convertir simplement en timestamp en utilisant

$sql1="SELECT UNIX_TIMESTAMP(' $timestamp')"; 

et enfin je compare simplement avec horodatage APNs de commentaires comme celui-ci

Les retours APNS retournent les jetons de périphériques si la remise de notification a échoué.
if($inactive_Timestamp>$dbTime_stamp) 
    { 
foreach ($apnsfeedback_tokens as $key => $value) { 
    # code... 

    $inactive_Token=$value['devtoken']; 

$sql= "DELETE FROM device_tokens WHERE device_token='$inactive_Token'"; 


if ($conn->query($sql) === TRUE) { 
    echo "Record deleted successfully"; 
} else { 
    echo "Error deleting record: " . $conn->error; 
} 
Questions connexes