Signatur
Beschreibung
PushManager.registrations() gehört zur alten, nicht standardisierten Simple Push API von Mozilla. Diese API war unter navigator.push nur in Firefox OS verfügbar. Mit der Methode konnte eine App herausfinden, welche Push-Endpunkte sie zuvor mit navigator.push.register() angelegt hatte, und zwar ohne neue Endpunkte zu erzeugen.
Der Aufruf gibt sofort ein DOMRequest-Objekt zurück. Ist die Anfrage erfolgreich, wird onsuccess ausgelöst. In request.result steht dann ein Array von Registrierungsobjekten. Jedes Objekt hat die Eigenschaften pushEndpoint (die URL, an die der App-Server Benachrichtigungen schickt) und version (die zuletzt empfangene Versionsnummer der Benachrichtigung). Schlägt die Anfrage fehl, wird onerror ausgelöst.
Man brauchte die Methode vor allem nach einem Neustart der App oder nach dem Systemereignis push-register. Dabei wurden bekannte Endpunkte mit dem eigenen Server abgeglichen und bei Bedarf neu registriert. In aktuellem Code sollte man sie nicht mehr verwenden. Der Ersatz ist die standardisierte Push API mit ServiceWorkerRegistration.pushManager.getSubscription(). Sie liefert ein Promise mit dem aktuellen PushSubscription-Objekt oder null.
Rückgabewert
DOMRequest. Bei Erfolg enthält result ein Array von Objekten der Form { pushEndpoint: string, version: number }. Hat die App keine Registrierungen, ist das Array leer.Beispiele
Bestehende Registrierungen auflisten (Firefox OS, veraltet)
// Nur in alten Firefox-OS-Umgebungen mit navigator.push vorhanden
if (navigator.push && typeof navigator.push.registrations === 'function') {
const req = navigator.push.registrations();
req.onsuccess = () => {
const regs = req.result;
console.log(`Anzahl Registrierungen: ${regs.length}`);
regs.forEach(({ pushEndpoint, version }) => {
console.log(`Endpunkt: ${pushEndpoint} (Version ${version})`);
});
};
req.onerror = () => {
console.error('Fehler beim Abfragen:', req.error?.name);
};
} else {
console.log('Simple Push API nicht verfügbar');
}
DOMRequest in ein Promise einpacken und mit dem Server abgleichen
const getRegistrations = () =>
new Promise((resolve, reject) => {
const req = navigator.push.registrations();
req.onsuccess = () => resolve(req.result);
req.onerror = () => reject(req.error);
});
const syncEndpoints = async () => {
const regs = await getRegistrations();
if (regs.length === 0) {
// Noch kein Endpunkt – neu registrieren
const req = navigator.push.register();
req.onsuccess = () => sendToServer(req.result);
return;
}
await Promise.all(regs.map((r) => sendToServer(r.pushEndpoint)));
};
const sendToServer = (endpoint) =>
fetch('/api/push-endpoints', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ endpoint })
});
if (navigator.push) syncEndpoints().catch(console.error);
Moderner Ersatz: getSubscription() der standardisierten Push API
const checkSubscription = async () => {
if (!('serviceWorker' in navigator) || !('PushManager' in window)) {
console.log('Push API nicht unterstützt');
return null;
}
const registration = await navigator.serviceWorker.ready;
const subscription = await registration.pushManager.getSubscription();
if (subscription) {
console.log('Aktiver Endpunkt:', subscription.endpoint);
} else {
console.log('Keine bestehende Push-Subscription');
}
return subscription;
};
checkSubscription();
// Wichtig · Fallstricke
- Veraltet und nicht standardisiert:
navigator.push.registrations()gab es nur in Firefox OS bzw. bei privilegierten Gecko-Apps. Kein aktueller Browser bietet die Methode an. Der heutigePushManager(registration.pushManager) hat keine Methoderegistrations(). - Rückgabe ist ein
DOMRequestund kein Promise.awaitfunktioniert deshalb nicht direkt; werasync/awaitnutzen will, muss den Aufruf selbst in ein Promise einpacken. - In Firefox OS brauchte die App die Berechtigung
pushim Manifest und musste die Systemnachrichtenpushundpush-registerbehandeln. Nachpush-registerwaren alte Endpunkte ungültig und mussten neu angelegt werden. - Für neue Projekte: Service Worker registrieren, dann mit
pushManager.getSubscription()die bestehende Subscription prüfen und bei Bedarf mitpushManager.subscribe({ userVisibleOnly: true, applicationServerKey })eine neue anlegen. Das funktioniert nur in einem sicheren Kontext (HTTPS). - Endpunkt-URLs sind geheim zu halten: Wer die URL kennt, kann der App Benachrichtigungen schicken. Übertrage sie deshalb nur verschlüsselt an den eigenen Server.