PHP Apple Amélioré de Notification Push d'erreur de lecture de la réponse
En PHP, comment voulez-vous utiliser fread() pour vérifier si il n'y est une réponse d'erreur lors de l'envoi d'amélioré les notifications push?
J'ai lu l'Apple docs, un couple vague postes via Google, et un couple de questions/réponses ici DONC, mais c'était toujours très déroutant.
Voici ce que j'ai regardé:
http://developer.apple.com/library/mac/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/IPhoneOSClientImp/IPhoneOSClientImp.html
Erreur de lecture de Apple amélioré de notification push avec PHP
iPhone Push de Notification de réponse d'Erreur problème
Je vais répondre à ma propre question ci-dessous, basé sur le fait que: (1) j'ai trouvé cela très confus sujet, et (2) j'ai dû morceau de l'information avec beaucoup d'essais et d'erreurs pour le faire fonctionner, et (3) ce blog qui dit qu'il est encouragé: http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/
OriginalL'auteur jsherk | 2012-04-07
Vous devez vous connecter pour publier un commentaire.
Lorsque vous envoyer une notification push, il y a plusieurs problèmes:
Si il y a un problème, Apple va déconnectez vous, mais vous ne savez pas à ce sujet. Lorsque vous utilisez la base des notifications il n'y a aucun moyen de savoir si ils ont tous été envoyé ou non. SOLUTION: C'est le point entier de l'utilisation d'un renforcement de notification, puis de vérifier qu'une réponse d'erreur. Veuillez noter que nous utiliserons "ORDER BY id" dans la requête de base de données, puis utiliser l'id que l'identifiant que nous envoyons dans la notification. De cette façon, si il y a un problème, nous savons exactement quelle ligne dans la db à l'origine du problème (et par conséquent, nous savons quand Apple déconnecté de nous et a cessé d'envoyer des notifications). On peut alors continuer à envoyer des notifications Push pour toutes les lignes après la ligne qui a provoqué le problème, sans avoir à renvoyer à ceux que nous avons déjà envoyé.
Apple n'envoie aucune réponse en retour si tout est ok, donc cela peut causer votre script pour mettre en pause et attendre que jamais, alors que fread() est en attente de données qui n'est pas venue. SOLUTION: Besoin de mettre stream_set_blocking à 0, de sorte que fread retourne toujours tout de suite. Notez que cela entraîne un autre problème mineur que fread pouvez retourner avant qu'il reçoit une réponse d'erreur, mais voir la solution de contournement dans le code, ce qui est juste pour faire une pause pendant 1/2 seconde APRÈS votre envoi est effectué, puis vérifier fread une fois de plus.
Vous pouvez envoyer plusieurs notifications push beaucoup plus rapide qu'une réponse d'erreur de revenir à vous. SOLUTION: Encore une fois c'est la même solution mentionnée ci-dessus... pause pendant 1/2 seconde APRÈS votre envoi est effectué, puis vérifier fread une fois de plus.
Voici ma solution à l'aide de PHP, qui répond à tous mes problèmes que j'ai rencontré. Son assez basique mais fait le travail. Je l'ai testé avec l'envoi d'un peu de notifications à l'heure ainsi que l'envoi de 120 000 à la fois.
$apple_error_response
est toujours faux. Mais certains de la poussée de remise des messages, et d'autres échouent. Avez-vous une idée de pourquoi je ne reçois pas de réponse?J'ai posté presque un an et demi et arrêté à l'aide de notifications push peu de temps après, donc je ne me souviens pas vraiment de toutes les questions que j'ai traitées. Pour le débogage de créer une liste de jetons que vous savez de travail puis copiez jetons & modifier de sorte qu'ils échouent (donc 5 connu une bonne & 5 mauvais connus). Ensuite, une fois que vous avez accepté de notification push sur votre appareil et bien vérifié que vous le recevez, désactiver les notifications push sur cet appareil et voir ce qui se passe lorsque vous essayez d'envoyer le jeton de nouveau. Vérifiez également la documentation d'Apple pour s'assurer qu'ils ne changent pas quelque chose sur la façon dont leur serveur répond.
Merci pour votre réponse. J'ai dû augmenter la usleep temps d'une seconde, puis il a travaillé (pour la plupart). Mais je n'étais pas sûr si la réponse serait là en ce moment. J'ai donc fait une boucle qui vérifie une réponse à toutes les 50 millisecondes, et si elle na pas venir au bout de 5 secondes il retourne.
Je n'ai même pas eu d'erreur de données lors de la fourniture d'un jeton de
lalelu
...?!La fin de la partie, mais j'ai compris que Apple va seulement vous dire si la poussée jeton n'est pas valide si vous l'envoyez un VALIDE, la valeur hexadécimale comme une poussée de jeton. Si elle ne l'est pas, le message de ne même pas être lu sur leur fin. Ainsi, le
lalelu
valeur doit d'abord être vérifié si c'est valable hex (utilisation de PHP ctype_xdigit)OriginalL'auteur
Suis pas sûr que le contenu de votre code, mais vous devez essayer ApnsPHP il est bien testé fonctionne parfaitement bien et il capable de gérer tous les possibles d'erreur et d'exception pour vous.
D'Autres Alternatives
https://github.com/sebastianborggrewe/PHP-Apple-Push-Notification-Server
https://github.com/bortuzar/PHP-Mysql---Apple-Push-Notification-Server
Avons testé les 2 sur le 3 j'ai des exemples et n'ont pas de problème de mise en œuvre et de gestion d'erreur.
Grâce
🙂
OriginalL'auteur