Signatur
Beschreibung
Die Eigenschaft expirationTime einer PushSubscription gibt an, wann das Push-Abonnement abläuft. Der Wert ist ein DOMHighResTimeStamp, also die Anzahl Millisekunden seit der Unix-Epoche (01.01.1970 UTC). Er lässt sich direkt an new Date() übergeben. Legt der Push-Dienst keinen Ablaufzeitpunkt fest, ist der Wert null.
Nützlich ist die Eigenschaft vor allem, um ein Abonnement rechtzeitig zu erneuern: Läuft es bald ab, kann die Anwendung vorher mit pushManager.subscribe() ein neues Abonnement anlegen und den neuen Endpunkt an den eigenen Server schicken. So gehen keine Push-Nachrichten verloren.
In der Praxis liefern die meisten Browser (Chrome, Firefox, Safari) derzeit null, weil deren Push-Dienste keinen festen Ablauf mitteilen. Der Code muss mit null also als Normalfall rechnen. Laufen Abonnements unerwartet ab oder werden sie widerrufen, meldet der Browser das im Service Worker über das Ereignis pushsubscriptionchange, soweit er es unterstützt.
Rückgabewert
null, wenn das Abonnement keinen bekannten Ablaufzeitpunkt hat.Beispiele
Ablaufzeitpunkt des aktuellen Abonnements auslesen
const zeigeAblauf = async () => {
const registration = await navigator.serviceWorker.ready;
const subscription = await registration.pushManager.getSubscription();
if (!subscription) {
console.log('Kein Push-Abonnement vorhanden.');
return;
}
const { expirationTime } = subscription;
if (expirationTime === null) {
console.log('Kein Ablaufzeitpunkt festgelegt.');
} else {
console.log('Läuft ab am:', new Date(expirationTime).toLocaleString('de-DE'));
}
};
zeigeAblauf();
Abonnement kurz vor Ablauf erneuern
const VAPID_PUBLIC_KEY = 'BEl62iUYgUivxIkv69yViEuiBIa-Ib9-SkvMeAtA3LFgDzkrxZJjSgSnfckjBJuBkr3qBUYIHBQFLXYp5Nksh8U';
const EINE_WOCHE = 7 * 24 * 60 * 60 * 1000;
const erneuereBeiBedarf = async () => {
const registration = await navigator.serviceWorker.ready;
const alt = await registration.pushManager.getSubscription();
const laeuftBaldAb =
alt?.expirationTime != null && alt.expirationTime - Date.now() < EINE_WOCHE;
if (alt && !laeuftBaldAb) return alt;
await alt?.unsubscribe();
const neu = await registration.pushManager.subscribe({
userVisibleOnly: true,
applicationServerKey: VAPID_PUBLIC_KEY
});
// Neuen Endpunkt beim eigenen Server hinterlegen
await fetch('/api/push/subscribe', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(neu)
});
return neu;
};
erneuereBeiBedarf().then((s) => console.log('Aktiver Endpunkt:', s.endpoint));
expirationTime in der JSON-Serialisierung
const registration = await navigator.serviceWorker.ready;
const subscription = await registration.pushManager.getSubscription();
// toJSON() enthält expirationTime ebenfalls
const daten = subscription.toJSON();
console.log(Object.keys(daten));
console.log(daten.expirationTime);
// Wichtig · Fallstricke
- Meist
null: Die gängigen Push-Dienste setzen derzeit keinen Ablaufzeitpunkt. Verlasse dich deshalb nicht allein auf diese Eigenschaft, sondern werte zusätzlich Fehlerantworten des Push-Dienstes auf dem Server aus (HTTP404/410bedeutet: Abonnement ungültig, Eintrag löschen). - Vergleich mit
null:nullwird in Rechnungen zu0. Ein Ausdruck wieexpirationTime < Date.now()ist danntrue, obwohl das Abonnement gar nicht abläuft. Prüfe immer vorher aufnull. - Schreibgeschützt: Eine Zuweisung hat keine Wirkung. Den Ablaufzeitpunkt bestimmt allein der Push-Dienst.
- Sichere Umgebung: Die Push-API gibt es nur in sicheren Kontexten (HTTPS oder
localhost) und nur mit registriertem Service Worker. - Kompatibilität: Chromium-Browser und Firefox unterstützen die Eigenschaft. In Safari gibt es sie ab Version 16 (macOS), unter iOS/iPadOS ab 16.4 und dort nur in Web-Apps, die auf dem Home-Bildschirm installiert sind.