2016-04-09 5 views
0

Ich habe einen Service-Mitarbeiter, der in der Lage ist, das Push-Ereignis von unserem Server zu empfangen, es funktioniert alles soweit. Die aktuelle Version von Chrome unterstützt keine Datennutzdaten innerhalb der empfangenen Benachrichtigung. Daher muss ich die Info über die Benachrichtigung (Titel, Text, ..) von dem Server abrufen, nachdem das Push-Ereignis aufgetreten ist.Web-Push-Benachrichtigungsdienst Arbeiter Design

Um sicherzustellen, dass der Benutzer nicht zweimal die gleiche Benachrichtigung erhält, speichere ich die IDs der "ausstehenden" Benachrichtigungen, die er noch nicht in einem Array erhalten hat. Jedes Mal, wenn der Service-Mitarbeiter den Server anpingt, wird das letzte Element aus dem Array abgerufen und aus dem Array entfernt.

Das Problem ist, dass, wenn während des Sendens oder während des Abrufs der Benachrichtigung eine Ausnahme beim Dienstabruf ausgelöst wird, der Dienstmitarbeiter eine Benachrichtigung dahinter hat, was bedeutet, dass z. Das Array enthält immer 2 Elemente, wenn nur eine neue Benachrichtigung aussteht.

Wie soll ich damit umgehen?

Antwort

1

Sobald das Ereignis push vom ServiceWorker abgefangen wurde, wird die Benachrichtigung als für GCM gesendet angesehen; ; unabhängig von der Ausgabe (d. h. die gut abgerufene Benachrichtigung wurde angezeigt oder ein Fehler trat während des Abrufprozesses auf).

Dennoch, wie Sie jeden Benachrichtigungsinhalt von Ihrem Server abrufen, können Sie eine 'abgeholte' Flag Server-Seite behandeln. Auf diese Weise könnte ein Abruf n Payloads zurückgeben, und dann kann Ihr ServiceWorker nself.registration.showNotification() in einem einzigen Ereignis push.

Schließlich, wenn eine error occurred während der Benachrichtigung an GCM, d. H. Eine Internal Server Error, senden, müssen Sie die Anforderung an GCM erneut versuchen. Wenn Ihre Anfrage jedoch erfolgreich war, Ihr ServiceWorker jedoch nie ein push-Ereignis erhalten hat, müssen Sie davon ausgehen, dass Ihre Benachrichtigung verloren gegangen ist ...