2013-06-04 3 views
9

senden Wenn ich eine Benachrichtigung an ein Gerät sende, und das Gerät ist offline ich so etwas wie:GCM Benachrichtigung an ein Offline-Gerät

Error: Unavailable

Und ich habe noch einmal zu senden.

Meine Frage ist:

Wird der GCM-Server diese Meldungen in einer Warteschlange halten und automatisch erneut, wenn das Gerät online ist? Oder es muss komplett von mir erledigt werden.

Denn wenn der GCM-Server sie wird automatisch senden (wenn das Gerät online ist), bis es tatsächlich sendet die Benachrichtigungen, mein Server übernimmt sie bereits gesendet werden. Wie kann der Zeitpunkt verfolgt werden, zu dem die Benachrichtigungen erfolgreich erneut gesendet werden?

Ich könnte auf meiner Serverseite markieren, dass die Benachrichtigungen nicht gesendet werden, indem Sie auf die Unavailable error message schauen, aber kann nicht erkennen, wie sie als gesendet markiert werden, sobald das GCM die Benachrichtigungen erfolgreich sendet.

Danke

Antwort

11

A/c Dokumentation --- Wenn eine 3rd-Party-Server sendet eine Nachricht an GCM und erhält eine Nachricht ID zurück, es bedeutet nicht, dass die Nachricht bereits an das Gerät geliefert wurde. Es bedeutet vielmehr, dass es zur Lieferung angenommen wurde. Was mit der Nachricht geschieht, nachdem sie akzeptiert wurde, hängt von vielen Faktoren ab.

Wenn das Gerät verbunden ist, aber im Leerlauf ist, wird die Nachricht trotzdem sofort zugestellt, es sei denn, das delay_while_idle-Flag ist auf "true" gesetzt. Andernfalls wird es in den GCM-Servern gespeichert, bis das Gerät aktiviert ist. Und hier spielt das collapse_key-Flag eine Rolle: Wenn bereits eine Nachricht mit demselben Kollabierungsschlüssel (und Registrierungs-ID) gespeichert ist und auf die Zustellung wartet, wird die alte Nachricht verworfen und die neue Nachricht wird an ihre Stelle treten (d. H. die alte Nachricht wird von der neuen Nachricht kollabiert). Wenn der Minimierungsschlüssel jedoch nicht festgelegt wird, werden die neuen und alten Nachrichten für die zukünftige Übermittlung gespeichert.

Hinweis: Es gibt eine Begrenzung für die Anzahl der Nachrichten, die gespeichert werden können, ohne zu kollabieren. Dieses Limit ist derzeit 100. Wenn das Limit erreicht ist, werden alle gespeicherten Nachrichten verworfen.

+0

Wie wird mein Server weiß, wann die Benachrichtigung endgültig (erfolgreich) gesendet wird? – user1537779

+0

Ich glaube nicht, dass es möglich ist, diese Informationen von den GCM-Servern zu erhalten. Das bedeutet, dass Sie sich auf eine andere Kommunikationsmethode zwischen den Client-Apps, die Ihre Nachricht erfolgreich empfangen, und Ihrem Server verlassen müssen. Die Antwort, die Sie von den GCM-Servern erhalten (wie Sie wissen), lässt Sie einfach wissen: Erfolg: Anzahl der Nachrichten, die ohne einen Fehler verarbeitet wurden. oder Fehler: Anzahl der Nachrichten, die nicht verarbeitet werden konnten. –

+0

'Ich könnte auf meiner Serverseite markieren, dass die Benachrichtigungen nicht gesendet werden, indem Sie auf die Fehlermeldung Nicht verfügbar klicken, aber nicht feststellen können, wie sie gesendet werden, nachdem das GCM die Benachrichtigungen erfolgreich gesendet hat Ich kann nicht wissen, ob der gcm-Server sie irgendwann später gesendet hat oder nicht. – user1537779

2

Was ich tat, war die Push-Indikation von der Payload zu trennen. In meiner GCM-Nachricht schließe ich nur einen URI an die Payload an, und ich speichere die Payload in einer Datenbanktabelle, auf die über den URI in der Nachricht zugegriffen werden kann.

Wenn der Client eine Nachricht empfängt, könnte es z.B. so aussehen, mit HATEOAS Stil Links:

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

Der Client dann die Nachricht Nutzlast von der URI GET geht, an welchem ​​Punkt der Server weiß, dass es ausgeliefert und kann entsprechend aktualisieren. Das Holen der Nutzdaten löscht es auch.

Wenn GCM Nachlieferung nicht robust genug ist, um das bedeutet auch, dass der Client manuell wählen kann, um alle anstehenden Nachrichten zu holen, z.B. Wenn die Netzwerkkonnektivität nach dem Offline-Zugriff fortgesetzt wird, indem ein Endpunkt verwendet wird, der alle Nachrichten für eine bestimmte ANDROID_ID oder eine ähnliche Nachricht zurückgibt. Wenn dann später die GCM Nachricht geliefert wird, würde der Kunde in dieser Nachricht ein 404 für den URI erhalten und behandeln, dass als ein no-op, das heißt, Nachricht bereits behandelt.

Wenn dies übertrieben, ein leichtgewichtiger Ansatz nur Server Bewusstsein für die Nachrichtenübermittlung zu erreichen ist es, einen Endpunkt zu haben, die einfach ACKS den Empfang einer Nachricht mit einer bestimmten ID, wie

POST https://my-server.com/push/notifyReceived 

{ 
    messageId: <messageId> 
} 
+0

Das ist ein interessanter Ansatz, aber er beantwortet die Frage nicht direkt. Versucht GCM erneut zu liefern? – Flimm

+1

Sie haben Recht. Das war vielleicht besser als Kommentar geeignet, aber ein bisschen zu lang und ich hoffte, es könnte jemandem helfen. – JHH