Signatur
Beschreibung
PushManager.supportedContentEncodings ist eine statische Eigenschaft. Man liest sie also direkt am Interface PushManager ab und nicht an einer Instanz wie registration.pushManager. Der Wert ist ein eingefrorenes Array mit Zeichenketten. Jede davon bezeichnet ein Verfahren, mit dem der Browser die verschlüsselte Nutzlast einer Push-Nachricht entschlüsseln kann.
Übliche Werte sind "aes128gcm" (der standardisierte Wert nach RFC 8188 und RFC 8291) und "aesgcm" (ein älterer Entwurfsstand, den einige Push-Dienste noch nutzen). Die Reihenfolge im Array zeigt die Präferenz des Browsers.
Gebraucht wird die Eigenschaft beim Anlegen eines Push-Abonnements. Der Client schickt die unterstützten Kodierungen zusammen mit dem PushSubscription-Objekt an den eigenen Anwendungsserver. Der Server wählt dann eine passende Kodierung für den Content-Encoding-Header, wenn er Nachrichten über das Web-Push-Protokoll verschickt. So vermeidet man Nachrichten, die der Browser nicht entschlüsseln kann.
Rückgabewert
Object.isFrozen() ergibt true) mit den unterstützten Kodierungen, z. B. ["aes128gcm", "aesgcm"].Beispiele
Unterstützte Kodierungen auslesen
if ('PushManager' in window) {
// Statischer Zugriff direkt am Interface
const encodings = PushManager.supportedContentEncodings ?? [];
console.log(encodings);
console.log(Object.isFrozen(encodings));
} else {
console.log('Push API wird nicht unterstützt');
}
Abonnement samt Kodierungen an den Server senden
const VAPID_PUBLIC_KEY = 'BEl62iUYgUivxIkv69yViEuiBIa-Ib9-SkvMeAtA3LFgDzkrxZJjSgSnfckjBJuBkr3qBUYIHBQFLXYp5Nksh8U';
const urlBase64ToUint8Array = (base64) => {
const padding = '='.repeat((4 - (base64.length % 4)) % 4);
const raw = atob((base64 + padding).replace(/-/g, '+').replace(/_/g, '/'));
return Uint8Array.from(raw, (c) => c.charCodeAt(0));
};
const subscribeAndRegister = async () => {
const registration = await navigator.serviceWorker.register('/sw.js');
const subscription = await registration.pushManager.subscribe({
userVisibleOnly: true,
applicationServerKey: urlBase64ToUint8Array(VAPID_PUBLIC_KEY)
});
// Fallback für ältere Browser ohne die Eigenschaft
const contentEncodings = PushManager.supportedContentEncodings ?? ['aesgcm'];
await fetch('/api/push/subscribe', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ subscription, contentEncodings })
});
console.log('Registriert mit:', contentEncodings[0]);
};
subscribeAndRegister().catch(console.error);
Bevorzugte Kodierung wählen (serverseitige Logik)
// Der Server wählt die erste Kodierung, die beide Seiten beherrschen
const SERVER_SUPPORTED = ['aes128gcm', 'aesgcm'];
const pickEncoding = (clientEncodings = ['aesgcm']) =>
clientEncodings.find((enc) => SERVER_SUPPORTED.includes(enc)) ?? null;
console.log(pickEncoding(['aes128gcm', 'aesgcm']));
console.log(pickEncoding(['aesgcm']));
console.log(pickEncoding(['unbekannt']));
// Wichtig · Fallstricke
- Statisch:
registration.pushManager.supportedContentEncodingsergibtundefined. Richtig istPushManager.supportedContentEncodings. - Schreibgeschützt und eingefroren:
push()oder das Überschreiben einzelner Einträge schlägt im strikten Modus mit einemTypeErrorfehl. Im nicht-strikten Modus passiert stillschweigend nichts. - Kompatibilität: Ältere Browser kennen die Eigenschaft nicht, auch wenn die Push API selbst vorhanden ist. Deshalb eine Feature-Erkennung und einen Fallback verwenden, etwa
?? ['aesgcm']. Safari unterstützt Web Push erst ab Version 16 (macOS 13); auf iOS/iPadOS ab 16.4 und dort nur für Web-Apps, die auf dem Home-Bildschirm installiert sind. - Sicherer Kontext: Die Push API gibt es nur über HTTPS (oder
localhost) und nur zusammen mit einem registrierten Service Worker. "aesgcm"ist ein veralteter Entwurf. Neue Server-Implementierungen sollten"aes128gcm"bevorzugen.- Die Eigenschaft sagt nur etwas über die Entschlüsselungsfähigkeit des Browsers aus. Ob ein Abonnement klappt, hängt zusätzlich von Nutzererlaubnis und Push-Dienst ab.