ServiceWorkerGlobalScope: pushsubscriptionchange-Ereignis
Sicherer Kontext: Diese Funktion ist nur in sicheren Kontexten (HTTPS) in einigen oder allen unterstützenden Browsern verfügbar.
Hinweis: Diese Funktion ist nur in Service Workers verfügbar.
Das pushsubscriptionchange
-Ereignis wird an den globalen Bereich eines ServiceWorker
gesendet, um eine Änderung in der Push-Abonnements zu signalisieren, die außerhalb der Kontrolle der Anwendung ausgelöst wurde.
Dies kann passieren, wenn das Abonnement vom Browser aktualisiert wurde, aber es kann auch vorkommen, wenn das Abonnement widerrufen oder verloren wurde.
Dieses Ereignis kann weder abgebrochen werden noch blubbert es.
Syntax
Verwenden Sie den Ereignisnamen in Methoden wie addEventListener()
oder setzen Sie eine Ereignishandler-Eigenschaft.
addEventListener("pushsubscriptionchange", (event) => {});
onpushsubscriptionchange = (event) => {};
Ereignistyp
Ein generisches Event
.
Verwendungshinweise
Obwohl Beispiele, die zeigen, wie Abonnement-bezogene Informationen mit dem Anwendungsserver ausgetauscht werden können, in der Regel fetch()
verwenden, ist dies möglicherweise nicht die beste Wahl für den praktischen Einsatz, da es beispielsweise nicht funktioniert, wenn die App offline ist.
Erwägen Sie die Verwendung einer anderen Methode, um Abonnementinformationen zwischen Ihrem Service Worker und dem Anwendungsserver zu synchronisieren, oder stellen Sie sicher, dass Ihr Code, der fetch()
verwendet, robust genug ist, um mit Fällen umzugehen, in denen der Versuch des Datenaustauschs fehlschlägt.
Hinweis:
In früheren Entwürfen der Spezifikation wurde definiert, dass dieses Ereignis gesendet wird, wenn ein PushSubscription
abgelaufen ist.
Beispiele
Dieses Beispiel, ausgeführt im Kontext eines Service Workers, hört auf ein pushsubscriptionchange
-Ereignis und meldet das abgelaufene Abonnement erneut an.
self.addEventListener(
"pushsubscriptionchange",
(event) => {
const conv = (val) =>
self.btoa(String.fromCharCode.apply(null, new Uint8Array(val)));
const getPayload = (subscription) => ({
endpoint: subscription.endpoint,
publicKey: conv(subscription.getKey("p256dh")),
authToken: conv(subscription.getKey("auth")),
});
const subscription = self.registration.pushManager
.subscribe(event.oldSubscription.options)
.then((subscription) =>
fetch("register", {
method: "post",
headers: {
"Content-type": "application/json",
},
body: JSON.stringify({
old: getPayload(event.oldSubscription),
new: getPayload(subscription),
}),
}),
);
event.waitUntil(subscription);
},
false,
);
Wenn ein pushsubscriptionchange
-Ereignis eintrifft, das anzeigt, dass das Abonnement abgelaufen ist, melden wir uns erneut an, indem wir die subscribe()
-Methode des Push-Managers aufrufen. Wenn das zurückgegebene Versprechen aufgelöst wird, erhalten wir das neue Abonnement. Dieses wird über einen fetch()
-Aufruf, um eine im JSON-Formatierte Version des Abonnement-endpoint
s an den Anwendungsserver zu senden, übermittelt.
Sie können auch die onpushsubscriptionchange
-Ereignishandler-Eigenschaft verwenden, um den Ereignishandler einzurichten:
self.onpushsubscriptionchange = (event) => {
event.waitUntil(
self.registration.pushManager
.subscribe(event.oldSubscription.options)
.then((subscription) => {
/* ... */
}),
);
};
Spezifikationen
Specification |
---|
Push API # the-pushsubscriptionchange-event |
Push API # dom-serviceworkerglobalscope-onpushsubscriptionchange |
Browser-Kompatibilität
BCD tables only load in the browser