5

Ich habe die Dokumentation für die Chrome-Implementierung der Web Push-API here durchgelesen und festgestellt, dass die API sagt "Sie versprechen, eine Benachrichtigung zu zeigen, wenn Sie einen Push erhalten" und unter den angegebenen Einschränkungen "Sie haben, um eine Benachrichtigung anzuzeigen, wenn Sie eine Push-Nachricht erhalten".Google Chrome Silent Push-Benachrichtigungen

Nachdem ich das Beispiel auf meinem localhost implementiert habe, habe ich cURL verwendet, um eine Push-Benachrichtigung erfolgreich zu senden. Ich war neugierig, also habe ich die Zeilen, die eigentlich die showNotification-Funktion aufrufen, auskommentiert und stattdessen eine console.log-Datei eingefügt und festgestellt, dass ich tatsächlich eine Push-Benachrichtigung senden, empfangen und vollständig ignorieren kann. Ich habe sogar versucht, eine if-Anweisung zu verwenden, um zu steuern, ob sie auf der Basis eines globalen Booleans angezeigt werden sollen, das ich von meiner Hauptseite aus gesteuert habe, und das hat funktioniert. Also fragte ich mich, ob jemand wusste, was sie meinten, indem ich sagte, dass du eine Benachrichtigung anzeigen musst und dass keine stillen Push-Benachrichtigungen verfügbar waren?

Dies war nicht nur für den Teufel davon, ich muss möglicherweise kontrollieren, ob diese Benachrichtigungen in meiner Web-App angezeigt werden, so wäre es toll, wenn das tatsächlich möglich wäre. Code unten, falls Sie neugierig sind.

self.addEventListener('push', function(event) { 
    var title = 'New Message'; 
    var body = 'You have received a new message!'; 
    var icon = '/img/favicon.png'; 
    var tag = 'well-notification'; 
    console.log("DID RECEIVE NOTIFICATION") 

    if(settingsShowNotification) { 
    event.waitUntil(
     self.registration.showNotification(title, { 
     body: body, 
     icon: icon, 
     tag: tag 
     }) 
    ); 
    } 
}); 

EDIT: Auf Chrome 47, wenn es relevant ist.

UPDATE: Nach weiterem Experimentieren fand ich das offensichtliche Problem, dass ich nicht die ursprüngliche globale Variable aktualisieren, sobald der Benutzer die Seite verlässt und dann wieder navigiert zu der gleichen Seite. Allerdings konnte ich dies umgehen, indem ich eine Variable auf dem Servicearbeiter selbst verwendete und eine Nachricht an den Service-Mitarbeiter über die API here verschickte, um den booleschen Befehl showNotifications umzuschalten.

Antwort

7

Sie müssen eine Benachrichtigung anzeigen, und wenn Sie keine Benachrichtigung anzeigen, erhalten Sie eine erzwungene Benachrichtigung vom Browser mit den Worten "Diese Seite wurde im Hintergrund aktualisiert". Aber die Anforderungen, die die gruselige Nachricht zeigen, wurden leicht gelockert:

Ab Januar '16 scheint es, als ob bis zu den letzten 10 Benachrichtigungen überprüft werden, ob jeder eine Benachrichtigung zeigte oder nicht. Wenn eine Benachrichtigung in den letzten zehn Benachrichtigungen nicht eine Benachrichtigung angezeigt hat, wird dies als ein Unfall betrachtet und der Browser zeigt nicht die gruselige "Diese Seite wurde im Hintergrund aktualisiert". Sie müssen zwei Benachrichtigungen in den letzten zehn für die gruselige Nachricht zu erscheinen verpassen.

Hinweis: Wenn die URL in der Adressleiste des aktiven Browser-Tab die Herkunft Ihrer Seite übereinstimmt, und der Browser ist nicht minimiert, Sie sind nicht erforderlich, um eine Benachrichtigung zu zeigen. Dies ist wahrscheinlich der Grund, warum Ihre Tests erfolgreich waren, wenn Sie während der Tests auf der Seite selbst waren.

Chromium Fehler, der die Umsetzung verfolgt: https://code.google.com/p/chromium/issues/detail?id=437277

Relevante Zeilen Quellcode: https://code.google.com/p/chromium/codesearch#chromium/src/chrome/browser/push_messaging/push_messaging_notification_manager.cc&l=249

+0

Wow! Danke für diese Antwort. Toller Fund! –

+3

In unserem Fall überprüfen wir nach Erhalt einer Benachrichtigung den Status auf dem Server und zeigen die Benachrichtigung nur an, wenn eine Bedingung erfüllt ist. Um eine erzwungene Benachrichtigung zu verhindern, geben wir nie erfüllte Versprechen wie 'event.waitUntil (new Promise (function() {}))' zurück. –

+0

Einige Kommentare. Wenn Sie feststellen möchten, ob Sie eine Benachrichtigung anzeigen müssen, überprüfen Sie die derzeit geöffneten Fensterclients, und prüfen Sie, ob einer davon visibilityState === 'visible' anzeigt. Es gibt eine neue Spezifikation namens Budget-API, mit der Entwickler überprüfen können, ob sie * keine * Benachrichtigungen anzeigen können (d. H. Stilles Push zulassen), aber dies ist auf einen bestimmten Betrag beschränkt. –