GCM-Benachrichtigung an ein Offline-Gerät senden

Wenn ich eine Benachrichtigung an ein Gerät schicke und das Gerät offline ist, bekomme ich etwas wie:

Fehler: Nicht verfügbar

Und ich muss wieder senden.

Meine Frage ist:

Wird der GCM-Server diese Benachrichtigungen in einer Warteschlange behalten und automatisch zurücksenden, wenn das Gerät online ist? Oder es muss von mir komplett behandelt werden.

Denn wenn der GCM-Server sie automatisch senden wird (sobald das Gerät online ist), bis es die Benachrichtigungen tatsächlich sendet, geht mein Server davon aus, dass sie bereits gesendet werden. Wie kann ich die Zeit verfolgen, wenn die Benachrichtigungen erfolgreich aktualisiert werden?

Ich könnte auf meiner Serverseite markieren, dass die Benachrichtigungen nicht gesendet werden, indem sie die Unavailable error message aber nicht herausfinden können, wie man sie markiert, sobald das GCM die Benachrichtigungen erfolgreich sendet.

Danke

  • Android GCM funktioniert nicht
  • Google Cloud Messaging-Implementierung in Java mit MySql
  • Das Senden einer GCM-Nachricht (serverseitig) scheitert oft - aber weit von immer
  • PARSE: Push Notifications "deviceToken" undefined
  • Google App Engine Probe App werfen 503
  • Bestimmtes Gerät, das keine Benachrichtigungen von Google Cloud Messaging empfängt
  • Was ist GCM Registrierungs-ID?
  • Wie können wir Geräte-Token für Android für Push-Benachrichtigung?
  • 2 Solutions collect form web for “GCM-Benachrichtigung an ein Offline-Gerät senden”

    A / c zur Dokumentation — Wenn ein Drittanbieter-Server eine Nachricht an GCM platziert und eine Nachrichten-ID zurückruft, bedeutet das nicht, dass die Nachricht bereits an das Gerät geliefert wurde. Vielmehr bedeutet es, dass es für die Lieferung akzeptiert wurde. Was passiert mit der Nachricht, nachdem es akzeptiert wird, hängt von vielen Faktoren ab.

    Wenn das Gerät angeschlossen ist, aber im Leerlauf ist, wird die Nachricht immer noch sofort ausgeliefert, es sei denn, das Flag "delay_while_idle" ist auf true gesetzt. Andernfalls wird es in den GCM-Servern gespeichert, bis das Gerät wach ist. Und das ist, wo die collapse_key Flagge spielt eine Rolle: Wenn es bereits eine Nachricht mit dem gleichen Collapse-Schlüssel (und Registrierungs-ID) gespeichert und warten auf die Lieferung, wird die alte Nachricht verworfen werden und die neue Nachricht wird seinen Platz (das heißt, Die alte Nachricht wird durch die neue zusammengebrochen). Wenn jedoch die Collapse-Taste nicht gesetzt ist, werden sowohl die neue als auch die alte Nachricht für die zukünftige Zustellung gespeichert.

    Anmerkung: Es gibt eine Begrenzung, wie viele Nachrichten gespeichert werden können, ohne zu kollabieren. Diese Grenze ist derzeit 100. Wenn die Grenze erreicht ist, werden alle gespeicherten Nachrichten verworfen.

    Was ich tat, war, die Push-Anzeige von der Nutzlast zu trennen. In meiner GCM-Nachricht habe ich nur einen URI zur Payload und ich speichere die Payload in einer Datenbanktabelle, die über den URI in der Nachricht zugänglich ist.

    Wenn der Client eine Nachricht erhält, könnte es zB so aussehen, mit HATEOAS Style Links:

     { _links: { message: { rel: 'message', href: 'https://my-server.com/push/<messageId>' } } } 

    Der Client geht dann auf die Nachricht Payload aus dem URI, an welchem ​​Punkt der Server weiß, dass es geliefert wurde und kann entsprechend aktualisieren. Das Abrufen der Nutzlast löscht es auch.

    Wenn die GCM-Neuauslieferung nicht robust genug ist, bedeutet dies auch, dass der Client es wählt, alle anstehenden Nachrichten manuell abzurufen, z. B. wenn die Netzwerkkonnektivität nach der Offline-Wiedergabe fortgesetzt wird, indem sie einen Endpunkt hat, der alle Nachrichten für eine gegebene ANDROID_ID oder ähnliches zurückgibt. Wenn dann später die GCM-Nachricht ausgeliefert wird, würde der Client eine 404 für den URI in dieser Nachricht erhalten und das als No-op behandeln, dh die Nachricht, die bereits behandelt wurde.

    Wenn dies übertrieben ist, ist ein leichter Ansatz, um nur das Server-Bewusstsein für die Nachrichtenübermittlung zu erreichen, einen Endpunkt zu haben, der einfach den Empfang einer Nachricht mit einer gegebenen ID, wie z. B.

     POST https://my-server.com/push/notifyReceived { messageId: <messageId> } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.