Signatur
Beschreibung
PushManager.hasPermission() war eine frühe, nicht standardisierte Methode der Push-API. Sie fragte ab, ob die aktuelle Web-App Push-Nachrichten empfangen darf. Das zurückgegebene Promise löste sich in einen PushPermissionStatus-String auf: 'granted' (erlaubt), 'denied' (abgelehnt) oder 'default' (Nutzer wurde noch nicht gefragt).
Man ruft die Methode über den PushManager einer Service-Worker-Registrierung auf, also über registration.pushManager. Typischerweise prüft man damit vor subscribe(), ob man den Nutzer überhaupt fragen muss oder ob Push schon blockiert ist. Dann blendet man zum Beispiel den „Benachrichtigungen aktivieren“-Button aus.
Die Methode ist veraltet und aus allen aktuellen Browsern entfernt. Nachfolger ist PushManager.permissionState(options). Diese Methode bekommt dieselben Optionen wie subscribe() (etwa userVisibleOnly) und liefert 'prompt' statt 'default'. Neuer Code sollte nur noch permissionState() oder die Permissions-API (navigator.permissions.query({ name: 'push', userVisibleOnly: true })) nutzen.
Rückgabewert
Beispiele
Berechtigung mit Feature-Erkennung und Fallback abfragen
// Liefert den Push-Status, egal ob alte oder neue API vorhanden ist
const getPushPermission = async () => {
const registration = await navigator.serviceWorker.ready;
const pm = registration.pushManager;
if (typeof pm.permissionState === 'function') {
// Moderne, standardisierte API
return pm.permissionState({ userVisibleOnly: true });
}
if (typeof pm.hasPermission === 'function') {
// Veraltete API aus frühen Chrome-Versionen
const status = await pm.hasPermission();
return status === 'default' ? 'prompt' : status;
}
return 'unsupported';
};
getPushPermission().then((status) => console.log('Push-Status:', status));
Button zum Aktivieren von Benachrichtigungen je nach Status anzeigen
const button = document.querySelector('#push-aktivieren');
const updateButton = async () => {
const { pushManager } = await navigator.serviceWorker.ready;
const status = pushManager.hasPermission
? await pushManager.hasPermission()
: await pushManager.permissionState({ userVisibleOnly: true });
switch (status) {
case 'granted':
button.hidden = true; // bereits erlaubt
break;
case 'denied':
button.disabled = true;
button.textContent = 'Benachrichtigungen blockiert';
break;
default: // 'default' bzw. 'prompt'
button.hidden = false;
button.textContent = 'Benachrichtigungen aktivieren';
}
console.log('Status:', status);
};
updateButton();
Moderne Alternative über die Permissions-API
const checkPush = async () => {
const result = await navigator.permissions.query({
name: 'push',
userVisibleOnly: true
});
console.log(result.state); // 'granted' | 'denied' | 'prompt'
result.onchange = () => console.log('Geändert zu:', result.state);
};
checkPush();
// Wichtig · Fallstricke
- Veraltet und entfernt:
hasPermission()gab es nur in frühen Chrome-Versionen, und sie war nie Teil der Spezifikation. In aktuellen Browsern ist sieundefined, ein Aufruf wirft also einenTypeError. Prüfe deshalb immer vorher, ob die Methode existiert, oder nutze gleichpermissionState(). - Andere Rückgabewerte: Die alte Methode liefert
'default', der NachfolgerpermissionState()und die Permissions-API liefern'prompt'. Bei gemischtem Code die Werte vereinheitlichen. - Kein Berechtigungsdialog: Die Methode fragt den Status nur ab. Den Dialog öffnet erst
subscribe()(oderNotification.requestPermission()). - Voraussetzungen: Die Push-API braucht einen sicheren Kontext (HTTPS oder
localhost) und einen registrierten, aktiven Service Worker. Auf iOS/iPadOS funktioniert Push erst ab Safari 16.4 und nur in einer Web-App, die zum Home-Bildschirm hinzugefügt wurde.