2010-04-12 5 views
17

Nous développons une application iPhone, et avons une notification push pour le développement et une version ad hoc fonctionnant correctement. Mais lorsque nous essayons d'envoyer une notification push à des périphériques utilisateur réels dans notre base de données, nous avons réinitialisé la connexion SSL, puis une erreur de tuyau cassé. Nous pensons qu'il y a peut-être trop de périphériques dans notre base de données (plus de 70000), donc il est impossible d'envoyer tous les messages en même temps. Nous essayons donc d'envoyer des messages à 1000 appareils une seule fois, mais nous avons quand même reçu cette erreur "Broken pipe" pour environ 100 messages. Et nous ne sommes pas sûrs que les messages ont été envoyés. Toute suggestion?get SSL Erreur de tuyau cassé lorsque vous essayez de faire une notification push

+0

Nous allons avoir la même question; mais avec 100 000 utilisateurs. Dans la mesure où nous pouvons dire que la notification atteindra la première centaine d'années, mais pas après cela. Je ne peux que supposer qu'il y a une limite (soit par le nombre ou le temps) sur les notifications qui sont envoyées. Pourrait vraiment faire avec quelqu'un pour le confirmer? – Wex

Répondre

18

Nous avons résolu ce problème. Il est cassé en raison de jetons invalides dans notre table de base de données. Et le service Apple Apns nous déconnectera s'il y a un jeton invalide. Étant donné que la connexion est rompue, l'erreur «Broken Pipe» s'affiche lorsque vous essayez d'envoyer à nouveau des messages. La solution de base consiste à déterminer si l'écriture sur le tube a réussi, sinon, déconnectez-vous et reconnectez-vous après un certain délai.

+11

Je souhaite que vous aviez expliqué comment vous avez codé ceci - Mona Jun 14 à 23:52 – Mona

+0

Habituellement, il arrive quand je boucle à travers tout jeton de l'appareil de l'utilisateur et si l'un échoue, il casse la chaîne et montre la même erreur, tout ce que nous peut faire est de trier l'utilisateur avec un jeton d'appareil récent et de vérifier la longueur de notre extrémité, cela a fonctionné après cela. Merci votre réponse m'a aidé!~ –

10

emagic est correct, une raison pour l'erreur "tuyau cassé" peut survenir à partir de jetons invalides. Il y a quelques autres raisons pour lesquelles cela peut arriver aussi. Ce qui suit est de Apple Technical Note TN2265:

Le problème le plus courant est un jeton de périphérique non valide. Si le jeton provient de l'environnement de bac à sable, par exemple lorsque vous testez un développement en interne, vous ne pouvez pas l'envoyer au service de production . Chaque environnement de commande émettra un jeton différent pour le même périphérique ou ordinateur que le . Si vous envoyez un jeton de périphérique au mauvais environnement , le service Push verra cela comme un jeton non valide et supprimera la notification. Un jeton de périphérique non valide peut également signifier que l'utilisateur a supprimé votre application de son périphérique ou de son ordinateur. Vous devez vérifier le service de retour au moins une fois par jour pour les jetons d'appareil qui ne sont plus valides.

D'autres problèmes possibles peuvent être l'envoi d'une charge utile supérieure à 256 octets, votre charge utile peut ne pas être formatée correctement, ou peut-être votre dictionnaire JSON a une syntaxe incorrecte.

Une déconnexion occasionnelle pendant que votre fournisseur est inactif n'a rien à voir avec ; rétablissez simplement la connexion et continuez. Si un des serveurs Push est hors service, le mécanisme d'équilibrage de charge dirigera de manière transparente votre nouvelle connexion vers un autre serveur en supposant que vous connectez par nom d'hôte et non par adresse IP statique.

1

Extension sur la réponse de Emagic, ceci est mon code php snipplet:

private $fp; 

private function connect(){ 
    $apnsHost  = 'gateway.push.apple.com'; 
    $apnsCert  = 'certs/cert.pem'; 
    $apnsPort  = 2195; 
    $pass   = "blah"; 
    $streamContext = stream_context_create(); 

    stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert); 
    stream_context_set_option($streamContext, 'ssl', 'passphrase', $pass); 
    $this->fp = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort, $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $streamContext); 
    if (!$this->fp) return("Failed to connect: $err $errstr<br>"); 
    echo 'Connected to APNS<hr />'; 
    } 

private function send(){ 
    $this->connect(); 
    foreach($pushes as $push) { 
    $payload['aps'] = array('alert' => $push->text, 'badge' => 0, 'sound' => 'default'); 
    $payload2 = json_encode($payload); 
    $msg = chr(0) . pack('n', 32) . pack('H*', $push->token) . pack('n', strlen($payload2)) . $payload2; 
    try { 
     $result = fwrite($this->fp, $msg, strlen($msg)); 
    } 
    catch (\Exception $e) { 
     fclose($this->fp); 
     echo('Error sending payload: ' . $e->getMessage()); 
     sleep(5); 
     $this->connect(); 
    } 
    } 
} 
+0

J'essaye d'utiliser ceci mais le try/catch ne semble pas déclenché, même quand fwrite() échoue. Je reçois des messages de la console disant qu'elle n'a pas pu écrire, mais je n'ai jamais reçu le message «Erreur d'envoi de données utiles» à envoyer. Êtes-vous sûr que fwrite() lance réellement des exceptions? – othomas

+0

Essayez de supprimer le \ leader \ Exception .... – JoeGalind

+0

Essayé cela, ne fait pas de différence. Le bloc catch n'est jamais appelé. – othomas

Questions connexes