Start · Sprachen · JavaScript · Referenz · PushManager.hasPermission()

PushManager.hasPermission()

Methode

Gibt ein Promise zurück, das sich in den Push-Berechtigungsstatus der Web-App auflöst: <code>'granted'</code>, <code>'denied'</code> oder <code>'default'</code>.

seit JavaScript Veraltet, nicht standardisiert – nur in frühen Chr deprecated seit ja Kategorie: webapi

Signatur

PushManager.prototype.hasPermission()

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

Typ
Promise<'granted' | 'denied' | 'default'>
Beschreibung
Ein Promise, das sich in den Berechtigungsstatus für Push-Nachrichten auflöst.

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));
Push-Status: prompt

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();
Status: default

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();
prompt

// 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 sie undefined, ein Aufruf wirft also einen TypeError. Prüfe deshalb immer vorher, ob die Methode existiert, oder nutze gleich permissionState().
  • Andere Rückgabewerte: Die alte Methode liefert 'default', der Nachfolger permissionState() 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() (oder Notification.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.