Einige Geräte empfangen keine Apple Push-Benachrichtigungen

8

Ich verwende das erweiterte iOS-Benachrichtigungsformat von Apple, um Push-Benachrichtigungen in großen Mengen zu senden und die in diesem Beitrag beschriebene PHP-Lösung zu verwenden: Ссылка

Die Erfahrung an diesem Punkt ist, dass, wenn ich eine Push-Benachrichtigung sende, einige Geräte die Nachricht empfangen und manche Geräte nicht. Die Ergebnisse sind inkonsistent. Manchmal empfängt Gerät X eine Benachrichtigung und manchmal Gerät X nicht. Ich protokolliere alles und bekomme keine Fehlerreaktionen.

Irgendwelche Gedanken darüber, was passiert, wären sehr hilfreich.

    
Chris 10.02.2014, 15:34
quelle

4 Antworten

0

Die Lösung in der Antwort, mit der Sie verknüpft sind, weist ein Problem auf. Es versucht, die Fehlerantwort zu lesen, nachdem jede Nachricht gesendet wurde, aber der Lesevorgang kehrt sofort zurück und wartet nicht darauf, dass eine Antwort verfügbar wird. Dies ist zwar effizienter als das Warten auf eine mögliche Fehlerreaktion für X Millisekunden nach jeder Nachricht, aber Sie könnten die Fehlerreaktion übersehen und die Verbindung könnte von Apple gelöscht werden, ohne dass Sie wissen, dass ein Fehler aufgetreten ist.

Obwohl ich Ihnen keinen Code geben kann, um Ihr Problem zu lösen, gebe ich Ihnen einen Rat.

Hier ist die Logik, die Sie verwenden sollten (laut Apple), aber ich habe es nicht geschafft, es zuverlässig zu machen (zumindest nicht in meiner Java-Implementierung):

  

Push-Benachrichtigungsdurchsatz und Fehlerprüfung

     

Wenn der Durchsatz weniger als 9.000 Benachrichtigungen pro Sekunde beträgt, könnte Ihr Server von einer verbesserten Fehlerbehandlungslogik profitieren.

     

So prüfen Sie bei Verwendung der erweiterten Binärschnittstelle auf Fehler. Schreiben Sie weiter, bis ein Schreibvorgang fehlschlägt. Wenn der Stream wieder zum Schreiben bereit ist, senden Sie die Benachrichtigung erneut und fahren Sie fort. Wenn der Stream nicht zum Schreiben bereit ist, prüfen Sie, ob der Stream zum Lesen verfügbar ist.

     

Wenn ja, lies alles, was im Stream verfügbar ist. Wenn Sie null Bytes zurück erhalten, wurde die Verbindung wegen eines Fehlers wie einem ungültigen Befehlsbyte oder einem anderen Analysefehler geschlossen. Wenn Sie sechs Byte zurück erhalten, ist dies eine Fehlerantwort, die Sie nach dem Antwortcode und der ID der Benachrichtigung suchen können, die den Fehler verursacht hat. Sie müssen jede darauffolgende Benachrichtigung erneut senden.

     

Nachdem alles gesendet wurde, überprüfen Sie noch einmal, ob eine Fehlerreaktion vorliegt.

     

Es kann eine Weile dauern, bis die unterbrochene Verbindung aufgrund normaler Latenz von APNs zurück zum Server gelangt. Es ist möglich, über 500 Benachrichtigungen zu senden, bevor ein Schreibvorgang fehlschlägt, weil die Verbindung unterbrochen wurde. Rund 1.700 Benachrichtigungen können nur fehlschlagen, weil die Pipe voll ist. Versuchen Sie es einfach erneut, sobald der Stream wieder zum Schreiben bereit ist.

     

Nun, hier werden die Kompromisse interessant. Sie können nach jedem Schreibvorgang nach einer Fehlerreaktion suchen, und Sie werden den Fehler sofort bemerken. Dies erhöht jedoch die Zeit, die benötigt wird, um einen Stapel von Benachrichtigungen zu senden.

     

Geräte-Tokens sollten fast alle gültig sein, wenn Sie sie korrekt erfasst haben und Sie sie an die richtige Umgebung senden. Daher ist es sinnvoll zu optimieren, vorausgesetzt, dass Fehler selten auftreten. Sie erhalten eine viel bessere Leistung, wenn Sie warten, bis der Schreibvorgang fehlschlägt oder der Stapel abgeschlossen ist, bevor Sie nach einer Fehlerreaktion suchen, und sogar die Zeit zum Senden der gelöschten Benachrichtigungen zählen.

     

Nichts davon ist wirklich spezifisch für APNs, es gilt für die meisten Programme auf Socket-Ebene.

     

Wenn Ihr Entwicklungstool Ihrer Wahl mehrere Threads oder Interprozesskommunikation unterstützt, könnten Sie einen Thread oder Prozess ständig auf eine Fehlerreaktion warten lassen und den Haupt-Thread oder -Prozess darüber informieren, wann er aufgibt und es erneut versucht. p>

Dies ist der Tech Note von Apple entnommen: Fehlerbehebung Push-Benachrichtigungen .

Ich weiß nicht, wie Sie in PHP feststellen, dass der Schreibvorgang fehlgeschlagen ist, aber wenn dies der Fall ist, sollten Sie versuchen, die fehlgeschlagene Benachrichtigung erneut zu schreiben. Wenn es erneut fehlschlägt, versuchen Sie, die Fehlerantwort zu lesen und die Verbindung zu schließen .

Wenn Sie die Fehlerantwort lesen, wissen Sie, welche Benachrichtigung fehlgeschlagen ist und Sie kennen den Fehlertyp (der wahrscheinlichste Fehler ist 8 - ungültiges Geräte-Token). Der Code in der Antwort, auf die Sie sich bezogen haben, führt nach dem Identifizieren dieses Fehlers nichts aus. Wenn Sie nach dem Schreiben von 100 Nachrichten eine Fehlerantwort für die 80. Nachricht erhalten, müssen Sie die Nachrichten 81 bis 100 erneut senden, da Apple sie nie erhalten hat. In meinem Fall (Java-Server) gelingt es mir nicht immer, die Fehlerreaktion zu lesen (manchmal bekomme ich einen Fehler, wenn ich versuche, die Antwort vom Socket zu lesen). In diesem Fall kann ich nur weitergehen und die nächsten Benachrichtigungen senden (und habe keine Möglichkeit zu wissen, welche Benachrichtigungen tatsächlich von Apple empfangen wurden). Aus diesem Grund ist es wichtig, die Datenbank von ungültigen Token freizuhalten.

Wenn Sie Ihre Datenbank sauber halten (dh nur Gerätetokens speichern, die von Apple an Ihre App gesendet wurden und alle derselben Push-Umgebung angehören - entweder Sandbox oder Produktion), sollten Sie keine ungültigen Daten finden Gerätemarken.

Ich habe ein ähnliches Problem bei der Implementierung des Push-Benachrichtigungsservers in Java festgestellt. Ich konnte nicht alle Fehlerreaktionen von Apple zuverlässig erhalten.

Ich habe festgestellt, dass es in Java eine Möglichkeit gibt, den TCP-Nagle-Algorithmus zu deaktivieren, der dazu führt, dass mehrere Nachrichten zwischengespeichert werden, bevor sie in einem Batch an Apple gesendet werden.Obwohl Apple uns dazu ermutigt, den Nagle-Algorithmus zu verwenden (aus Leistungsgründen), habe ich festgestellt, dass ich 100% der Fehlerantworten erhalte, wenn ich sie deaktiviere und dann versuche, die Antwort von Apple nach jeder Nachricht zu lesen (I verifizierte es, indem er einen Prozess schrieb, der den APNS-Server simulierte).

Indem Sie den Nagle-Algorithmus deaktivieren und die Benachrichtigungen langsam nacheinander senden und versuchen, die Fehlerantwort nach jeder Nachricht zu lesen, können Sie alle ungültigen Tokens in Ihrer Datenbank finden und entfernen. Sobald Sie wissen, dass Ihre Datenbank sauber ist, können Sie den Nagle-Algorithmus aktivieren und das Senden von Benachrichtigungen schnell wieder aufnehmen, ohne die Fehlerreaktionen von Apple zu lesen. Wenn Sie beim Schreiben einer Nachricht in den Socket einen Fehler erhalten, können Sie einfach einen neuen Socket erstellen und versuchen, nur die letzte Nachricht zu senden.

    
Eran 13.02.2014, 09:50
quelle
6

Es gibt keine Garantie, dass Push-Benachrichtigungen tatsächlich zugestellt werden, selbst wenn der APNS-Server sie akzeptiert hat.

Soweit es Ihren Server betrifft, sind Push-Benachrichtigungen Fire-and-Forget; Es gibt keine Möglichkeit, den Status einer Benachrichtigung nach dem Senden an APNS herauszufinden. Die Lieferzeit kann auch variieren, von Sekunden bis zu einer halben Stunde.
         Außerdem kann das iPhone des Benutzers möglicherweise nicht immer Push-Benachrichtigungen erhalten. Sie können sich in einem WiFi-Netzwerk befinden, das keine Verbindungen zu APNS ermöglicht, da die erforderlichen Ports blockiert sind. Oder das Telefon könnte ausgeschaltet werden.

APNS versucht, die letzte Benachrichtigung für das Gerät zu übermitteln, wenn es zurückkommt online em> , aber es wird nur für eine begrenzte Zeit versuchen. Sobald die Zeit abgelaufen ist, ist die Push-Benachrichtigung für immer verloren!

    
user2289379 13.02.2014 08:13
quelle
0

Ich habe dieses Problem auch in meinen verschiedenen Anwendungen erfahren. Der Grund für einige Geräte, die die Push-Benachrichtigungen nicht erhalten, kann sein:

  • Verwenden des Sandbox-APNS-Servers mit dem Produktions-APNS-Zertifikat. - & gt; Bitte überprüfen Sie es
  • Sowohl provisorische Profile für die Entwicklung als auch für die Produktion sind auf dem Gerät installiert. - & gt; Entfernen Sie beide provisorischen und dann müssen Sie mindestens 24 Stunden warten, damit apple auch den Geräte-Token von seinem Server entfernt.
Usman Awan 15.02.2014 15:01
quelle
0

In meinem Fall wurden während der Entwicklung einige APNs nicht in einem Gerät empfangen (ich habe es mit PushMeBaby ) getestet.

Ich habe alle vorherigen Bereitstellungsprofile meines Projekts von meinem Gerät entfernt, und von diesem Moment an ging alles gut. Um das zu tun gehen Sie zu Einstellungen & gt; Profile.

Vielleicht hatte ich irgendeine Art von Konflikt mit Profilen, seit das Projekt, an dem ich arbeite, die Bundle-ID und die Bereitstellungsprofile seither geändert hat.

    
Xavi Gil 26.03.2014 15:44
quelle