2012-12-12 1 views
9

Ich habe ein Problem, wo einige Geräte keine Push-Benachrichtigung erhalten, seit gestern. Das Zertifikat/Geräte-Token scheint korrekt zu sein, da das Gerät bis gestern Push-Benachrichtigungen erfolgreich empfangen hat.Push-Benachrichtigung erfolgreich gesendet, aber das Gerät nicht empfangen (gelegentlich)

Auf der Serverseite gibt es keine Fehler oder Verbindungsverweigerungen, und die Push-Benachrichtigung scheint jedes Mal erfolgreich gesendet zu werden.

Dennoch gibt es viele Gelegenheiten, bei denen das Gerät den Push nicht korrekt empfängt.

Einige Umgebungsinformationen:

  • Ich tue dies auf die Produktionsumgebung.
  • Keine Fehler/Verbindungsverweigerungen auf der Serverseite
  • Ich sende immer die genau gleiche JSON.
  • 2 unserer Geräte erhalten die Benachrichtigung nicht Push AT ALL seit gestern
  • 1 unserer Vorrichtung mit einer niedrigeren Erfolgsrate Push-Benachrichtigungen erhält (etwa 70%) als gestern
  • 1 ~ 2 unserer Geräte erhalten nach wie vor Push-Benachrichtigungen auch jetzt erfolgreich.
  • Alle oben genannten Geräte konnten bis gestern in der Produktionsumgebung ordnungsgemäß Push-Benachrichtigungen empfangen.

Es gibt keinen Unterschied in dem serverseitigen Ergebnis, wenn der Druck erfolgreich ist, und wenn das Gerät es nicht empfängt ... Daher ist es praktisch unmöglich, das Problem zu identifizieren.

Dies ist die serverseitige PHP-Code verwende ich:

 $ctx = stream_context_create(); 
     stream_context_set_option($ctx, 'ssl', 'local_cert', $this->apnsData[$development]['certificate']); 
     $fp = stream_socket_client($this->apnsData[$development]['ssl'], $error, $errorString, 100, (STREAM_CLIENT_C ONNECT|STREAM_CLIENT_PERSISTENT), $ctx); 

     if(!$fp){ 
       $this->_pushFailed($pid); 
       $this->_triggerError("Failed to connect to APNS: {$error} {$errorString}."); 
     } 
     else { 
       $msg = chr(0).pack("n",32).pack('H*',$token).pack("n",strlen($message)).$message; 
       $fwrite = fwrite($fp, $msg); 
       if(!$fwrite) { 
         error_log("[APNS] push failed..."); 
         $this->_pushFailed($pid); 
         $this->_triggerError("Failed writing to stream.", E_USER_ERROR); 
       } 
       else { 
         error_log("[APNS] push successful! ::: $token -> $message ($fwrite bytes)"); 
       } 
     } 
     fclose($fp); 

Das Protokoll sagt mir, dass die Push erfolgreich war (das Token für die Privatsphäre Ausschneiden):

[Wed Dec 12 11:42:00 2012] [error] [client 10.161.6.177] [APNS] push successful! ::: aa4f******44 -> {"aps":{"alert":{"body":"\\u300casdfasdf\\u300d","action-loc-key":"OK"},"badge":4,"sound":"chime"}} (134 bytes) 

Wie löse ich das?

+0

So habe ich erhalten Beratung, dass das Öffnen und Schließen der Buchse für jede einzelne Nachricht nicht r empfohlen, wie in den offiziellen Dokumenten von Apple vermerkt: "Sie sollten auch Verbindungen mit APNs über mehrere Benachrichtigungen beibehalten. APNs können Verbindungen in Betracht ziehen, die schnell und wiederholt als Denial-of-Service-Angriffe eingerichtet und abgebaut werden. Bei einem Fehler schließt APNs die Verbindung, bei der der Fehler aufgetreten ist. " Also werde ich versuchen, meine Architektur zu reparieren, so dass ich eine Verbindung über mehrere Nachrichten wiederverwenden kann. Jeder Ratschlag beim Entwerfen eines Systems zur Wiederverwendung der Verbindung wird nett sein. Danke – ashiina

+1

wie viele Push-Benachrichtigungen senden Sie? – hjm

+0

@hjm Ich würde sagen, mehr als 2 pro Sekunde.Die App ist in den Läden, so dass wir eine aktive Benutzerbasis bereits haben. – ashiina

Antwort

4

Gelöst dies von mir, also werde ich eine Antwort sein Posting.

Ich habe erhalten Ratschläge, die das Öffnen und Schließen der Buchse für jede einzelne Nachricht wird nicht empfohlen, wie in Apples offiziellen Dokumenten festgestellt:

„Sie sollten auch Verbindungen mit APNs über mehrere Mitteilungen behalten.APNs können Verbindungen in Betracht ziehen, die schnell und wiederholt als Denial-of-Service-Angriffe eingerichtet und abgebaut werden. Bei Fehler, schließt APNs die Verbindung, auf dem der Fehler aufgetreten ist.“

befestigte ich meine Architektur, so dass die Verbindung im gesamten mehrere APNS Anrufe gehalten wird, und jetzt funktioniert es ohne Probleme. habe ich ein Warteschlangen-System basierend auf APNs-php (https://code.google.com/p/apns-php/)

Hier ist mein Code, für alle, die es braucht.

https://github.com/ashiina/APNS-QueueServer

1

Überprüfen Sie zuerst, ob Ihr Gerät Jailbreak ist, dann wird es PushNotification nicht unterstützen. Dazu musst du die SAMPref-App von Cydia herunterladen und diese App öffnen, dann unterstützt dein Gerät Push-Benachrichtigungen. Sie können Ihr Gerät für die Push-Benachrichtigung testen, indem Sie die iPusher-App im App Store verwenden. Wenn Sie eine Push-Benachrichtigung erhalten, wird Ihr Gerät unterstützt.

Nach dieser ersten Prüfung wird Ihre App mit einem geeigneten Push-Benachrichtigungszertifikat signiert?

Thank