Push-Benachrichtigungen für PWAs unter iOS sind eines der meistdiskutierten Themen
unter Webentwicklern in den letzten zwei Jahren. Apple hat diese Funktion lange Zeit zurückgehalten und als sie sie schließlich freigaben, taten sie dies mit Einschränkungen, die in der Praxis immer noch Fragen aufwerfen.
In diesem Artikel finden Sie eine technische Analyse, die auf meiner Erfahrung mit zwei realen Projekten basiert: Kazki AI – ein Dienst zur Generierung von Kindermärchen nach Eingabeaufforderung (das Projekt ist bereits eingestellt) und der Blog eines praktizierenden Psychologen, wo Push-Benachrichtigungen Abonnenten über neue Kurse und Veröffentlichungen informierten.
Was funktioniert, was nicht, und welcher Code wird benötigt, damit alles auf dem iPhone funktioniert.
Wenn Sie noch zwischen einer PWA und einer nativen App wählen, lesen Sie zuerst
PWA vs. Native im Jahr 2026: Vergleich und realer Anwendungsfall
.
📚 Inhalt des Artikels
🎯 Abschnitt 1. Warum iOS Push-Benachrichtigungen für PWAs jahrelang nicht unterstützte
Kurze Antwort: Bis iOS 16.4 (März 2023) konnten Web-Apps auf dem iPhone
überhaupt keine Push-Benachrichtigungen empfangen – Apple hat Web Push für iOS einfach nicht implementiert, obwohl Android es bereits seit vielen Jahren unterstützte.
Android (Chrome) unterstützt Web Push seit 2015. Apple fügte die Unterstützung
für iPhone und iPad erst mit iOS 16.4 hinzu – acht Jahre später. Offiziell hat Apple
keine Gründe genannt. Die am weitesten verbreitete Hypothese in der Branche ist geschäftlicher Natur:
PWAs mit vollwertigen Push-Benachrichtigungen verringern den Anreiz, Apps im App Store zu veröffentlichen,
wo Apple eine Provision von 15–30 % erhebt. Dies ist jedoch eine Vermutung und kein bestätigter Fakt.
Bis iOS 16.4 konnten Web-Apps auf dem iPhone keine
Push-Benachrichtigungen empfangen – Web Push fehlte einfach auf der Plattform.
Es war keine technische Hürde: Safari auf macOS unterstützte
Push-Benachrichtigungen für Websites bereits seit OS X Mavericks (2013) und nutzte
APNs (Apple Push Notification service). Allerdings war dies eine proprietäre
Implementierung von Apple, und der Standard-Web-Push (Push API + VAPID) erschien
erst in Safari auf macOS Version 16 (2022). Genau auf dieser Basis hat Apple
die Unterstützung für iOS aufgebaut.
[WebKit: Web Push for Web Apps on iOS and iPadOS]
Auch externer Druck spielte eine Rolle: Die regulatorische Aufmerksamkeit für den App Store
in der EU und anderen Gerichtsbarkeiten veränderte allmählich die Haltung von Apple gegenüber Web-Apps.
Ein bezeichnender Vorfall ereignete sich später, im Februar 2024: In der Beta-Version von iOS 17.4
für EU-Nutzer kündigte Apple an, dass es Home Screen
Web-Apps aufgrund der Anforderungen des Digital Markets Act nicht mehr in gewohnter Weise unterstützen könne –
und nach einer Welle der Kritik von Entwicklern verzichtete es noch vor der Veröffentlichung auf diese Entscheidung.
Das heißt, Web Push für iOS erschien früher und unabhängig von dieser Geschichte.
[Brainhub: PWA on iOS — Current Status]
🎯 Abschnitt 2. iOS 16.4, 17, 18: Chronologie der Änderungen – Was kam hinzu und was ist immer noch kaputt
Die wichtigste Änderung geschah einmal – mit iOS 16.4. Die folgenden Versionen
änderten das grundlegende Modell nicht, und das Problem mit dem "Verschwinden" der Abonnements ist laut Entwicklern nicht vollständig verschwunden.
iOS 16.4 öffnete Web Push für PWAs, die zum Startbildschirm hinzugefügt wurden, und erlaubte
Drittanbieter-Browsern, "Zum Startbildschirm hinzufügen" anzubieten. iOS 17 und 18
brachten keine radikalen Änderungen bei Web Push, aber Entwickler melden weiterhin
Fälle, in denen Push-Abonnements ohne ersichtlichen Grund "verschwinden".
iOS 16.4 ist der Anfang, nicht das Ende. Das grundlegende Modell (Push nur
für installierte PWAs) hat sich nicht geändert, und die Zustellungsstabilität
unter iOS ist nach Erfahrung von Entwicklern immer noch schlechter als unter Android.
iOS 16.4 (März 2023) – Die Freigabe
Die erste Version mit Unterstützung für Web Push für Home Screen Web-Apps.
Benachrichtigungen erscheinen auf dem Sperrbildschirm, im Mitteilungszentrum
und auf der Apple Watch. Auch die Unterstützung der Badging API wurde hinzugefügt.
In derselben Version erhielten Drittanbieter-Browser (Chrome, Edge und andere)
die Möglichkeit, Benutzern im Teilen-Menü "Zum Startbildschirm hinzufügen" anzubieten.
[WebKit: Web Push for Web Apps on iOS and iPadOS]
Die Praxis zeigte ein Problem: Entwickler berichteten, dass Push-Abonnements
nach 1–2 Wochen nicht mehr funktionierten. Der Endpunkt wurde inaktiv,
und der Benutzer musste die PWA neu installieren, um sich erneut anzumelden.
[Apple Developer Forums: PWA Push Issues iOS]
iOS 17 (September 2023) – Keine Änderungen bei Web Push
Unter iOS 17 hat sich das grundlegende Modell von Web Push nicht geändert: Abonnements sind weiterhin
nur für Web-Apps möglich, die zum Startbildschirm hinzugefügt wurden. Einige Entwickler
verzeichneten eine verbesserte Stabilität, aber Beschwerden über verschwindende Abonnements
blieben bestehen.
[OneSignal: iOS Web Push Setup]
iOS 17.4 (Februar–März 2024) – Der EU-Vorfall
In der Beta-Version von iOS 17.4 für EU-Nutzer kündigte Apple den Verzicht
auf vollwertige Home Screen Web-Apps an (sie würden sich wie normale
Safari-Tabs öffnen). Nach Kritik von Entwicklern und Regulierungsbehörden wurde diese Entscheidung
rückgängig gemacht, und die PWA-Unterstützung in der EU blieb bestehen.
iOS 18 (September 2024) – Stabilisierung
Es gab keine wesentlichen Änderungen an der Web Push API. Einige Entwickler verzeichnen
eine verbesserte Zustellungszuverlässigkeit, andere – dieselben Probleme mit dem Verlust
von Abonnements nach längerer Inaktivität der App.
[Apple Developer Forums: Diskussionen zu iOS 17–18]
🎯 Abschnitt 3. Die Hauptbedingung: Die PWA muss zum Startbildschirm hinzugefügt werden – unabhängig vom Browser
Push-Benachrichtigungen unter iOS funktionieren nur für Web-Apps, die
zum Startbildschirm hinzugefügt wurden (Teilen → Zum Startbildschirm hinzufügen). Eine offene Registerkarte –
ob in Safari oder einem anderen Browser – gibt kein Push-Abonnement.
Im Gegensatz zu Android, wo Chrome direkt in einem Tab nach der Erlaubnis für Push-Benachrichtigungen fragen kann, verlangt iOS, dass die Website als eigenständige App auf dem Startbildschirm installiert ist. Seit iOS 16.4 kann sie nicht nur über Safari hinzugefügt werden: Drittanbieter-Browser können im Teilen-Menü auch "Zum Startbildschirm hinzufügen" anbieten. Das Ergebnis ist dasselbe – die Website öffnet sich
als Home Screen Web-App und hat dieselbe Push-Unterstützung. Wichtig: Das Vorhandensein
des Eintrags im Menü hängt vom jeweiligen Browser ab, daher ist es besser, in der Anleitung
für den Benutzer den universellen Weg
"Teilen → Zum Startbildschirm" anzuzeigen.
Web Push unter iOS ist nur für Home Screen Web-Apps verfügbar:
Eine zum Startbildschirm hinzugefügte Website kann die Erlaubnis für Benachrichtigungen anfordern,
aber nur als Reaktion auf eine Benutzeraktion – zum Beispiel das Klicken auf die Schaltfläche
"Abonnieren".
Das bedeutet, dass Sie vor der Anforderung der Erlaubnis für Benachrichtigungen
drei Dinge überprüfen müssen: ob es sich um iOS handelt, ob
PushManager verfügbar ist und ob die App im Standalone-Modus geöffnet ist
(d. h. auf dem Startbildschirm installiert ist). Beachten Sie: iPads mit iPadOS 13+
stellen sich im User Agent als Mac dar, daher reicht die Überprüfung nur auf
iphone|ipad nicht aus.
function canUsePush() {
const isIOS =
/iphone|ipad|ipod/i.test(navigator.userAgent) ||
(navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1); // iPadOS
const isStandalone =
window.matchMedia('(display-mode: standalone)').matches ||
window.navigator.standalone === true;
if (isIOS && !isStandalone) {
// Hinweis anzeigen: "Zum Startbildschirm hinzufügen, um Benachrichtigungen zu erhalten"
showInstallPrompt();
return false;
}
return 'serviceWorker' in navigator && 'PushManager' in window;
}
Wenn Sie diese Überprüfung überspringen, sind die APIs für Push-Benachrichtigungen in einem normalen Tab unter iOS
nicht verfügbar (z. B. fehlt PushManager), und der Abonnementcode
wird mit einem Fehler abstürzen. Der Benutzer wird nicht verstehen, warum die Schaltfläche
"Abonnieren" nicht funktioniert – daher sollte der Hinweis zur Installation
im Voraus angezeigt werden.
🎯 Kapitel 4. Schritt für Schritt: Benutzerabonnement für Push auf iOS
Das Abonnement auf iOS erfordert eine Benutzergeste –
die Berechtigungsanfrage kann nicht automatisch beim Laden der Seite aufgerufen werden,
nur als Reaktion auf eine Benutzeraktion.
Auf iOS kann eine Webanwendung, die zum Home-Bildschirm hinzugefügt wurde, nur als Reaktion auf eine direkte Interaktion – z. B. das Klicken auf die Schaltfläche „Abonnieren“ – um Benachrichtigungsberechtigungen bitten. Daher muss Notification.requestPermission() direkt aus dem Klick-Handler aufgerufen werden. Aufrufe aus setTimeout, DOMContentLoaded oder anderem automatischen Code funktionieren auf iOS nicht. Unter Android ist eine solche Anfrage technisch auch ohne Klick möglich, aber Browser blockieren sie zunehmend, daher ist eine Trigger-Schaltfläche eine universelle Praxis.
[WebKit: Web Push für Web-Apps auf iOS und iPadOS]
Die Anfrage zur Berechtigung für Push-Benachrichtigungen auf iOS wird nur als Reaktion auf eine Benutzeraktion akzeptiert: Automatische Anfragen beim Laden der Seite funktionieren nicht.
[Apple WWDC22: Meet Web Push for Safari]
Hier ist der vollständige Abonnement-Flow aus einem realen Projekt von Kazki AI
(die Funktion canUsePush() haben wir im vorherigen Kapitel definiert):
const VAPID_PUBLIC_KEY = 'YOUR_PUBLIC_VAPID_KEY';
// Konvertierung des VAPID-Schlüssels (base64url) in Uint8Array für subscribe()
function urlBase64ToUint8Array(base64String) {
const padding = '='.repeat((4 - (base64String.length % 4)) % 4);
const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');
const raw = atob(base64);
return Uint8Array.from([...raw].map(ch => ch.charCodeAt(0)));
}
async function initPushSubscription() {
// 1. Überprüfung der Unterstützung und des Standalone-Modus auf iOS (siehe Kapitel 3)
if (!canUsePush()) return;
try {
// 2. Anforderung der Berechtigung – die ERSTE asynchrone Aktion im Klick-Handler,
// solange die Benutzergeste noch "lebendig" ist. Wenn die Berechtigung bereits erteilt wurde –
// gibt die Methode sofort 'granted' zurück.
const permission = await Notification.requestPermission();
if (permission !== 'granted') return; // 'denied' – Hinweis zur Einstellung anzeigen
// 3. Warten auf den Service Worker
const reg = await navigator.serviceWorker.ready;
// 4. Abrufen des vorhandenen Abonnements oder Erstellen eines neuen
let subscription = await reg.pushManager.getSubscription();
if (!subscription) {
subscription = await reg.pushManager.subscribe({
userVisibleOnly: true,
applicationServerKey: urlBase64ToUint8Array(VAPID_PUBLIC_KEY)
});
}
// 5. Speichern (oder Aktualisieren) des Abonnements auf dem Server
const { endpoint, keys } = subscription.toJSON();
const response = await fetch('/api/push/subscribe', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
endpoint: endpoint,
p256dh: keys.p256dh,
auth: keys.auth
})
});
if (!response.ok) throw new Error('Server hat Abonnement abgelehnt: ' + response.status);
} catch (e) {
console.error('Push-Fehler:', e.message);
}
}
// Nur per Klick abonnieren – nicht automatisch!
document.querySelector('#push-btn')
.addEventListener('click', initPushSubscription);
Beachten Sie die Reihenfolge: requestPermission() wird vor allen await-Aufrufen für andere Operationen aufgerufen. Außerdem ist es besser, das Abonnement jedes Mal an den Server zu senden, auch wenn es bereits existiert – so hat das Backend immer den aktuellen Endpunkt.
Der Abonnement-Endpunkt unter iOS beginnt normalerweise mit
https://web.push.apple.com/, unter Chrome auf Android – mit
https://fcm.googleapis.com/. Das ist praktisch für die Diagnose,
aber man sollte die Logik nicht starr daran binden: das Format kann sich ändern.
[pqvst.com: Web-Push-Benachrichtigungen entmystifiziert]
🎯 Kapitel 5. Web App Manifest und Service Worker: obligatorische Einstellungen
Für Web Push auf iOS muss die Website als Home Screen Web App installiert sein,
und das Manifest muss den Anzeigemodus standalone
(oder fullscreen) deklarieren. Ohne dies funktioniert die Push-API in Ihrer Anwendung nicht, auch wenn alles andere korrekt konfiguriert ist.
Apple betrachtet eine Website als „Home Screen Web App“, deren Manifest einen anderen Anzeigemodus als einen normalen Tab angibt. Wenn dies nicht der Fall ist, ist PushManager nicht verfügbar und der Abonnementcode wird nicht ausgeführt. Praktische Schlussfolgerung: Geben Sie immer "display": "standalone" an.
[GitHub: webpush-ios-example]
Push auf iOS ist nur für Websites verfügbar, die zum Home-Bildschirm hinzugefügt wurden –
und ein Manifest mit display: standalone ist eine praktische
Voraussetzung für die korrekte Funktion einer solchen Anwendung.
Minimales manifest.json für die Push-Funktion auf iOS:
{
"name": "Kazki AI",
"short_name": "Kazki",
"display": "standalone",
"start_url": "/",
"scope": "/",
"background_color": "#ffffff",
"theme_color": "#6366f1",
"icons": [
{
"src": "/images/icon-192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/images/icon-512.png",
"sizes": "512x512",
"type": "image/png"
}
]
}
Die Icons müssen echte, verfügbare PNG-Dateien in der richtigen Größe sein.
Fügen Sie zusätzlich <link rel="apple-touch-icon" href="/images/icon-192.png">
in den <head> ein: iOS orientiert sich traditionell genau daran.
Wenn kein Icon vorhanden ist, verwendet iOS ein Fallback-Icon, und die Anwendung
sieht auf dem Home-Bildschirm unprofessionell aus.
Service Worker: Warum man keine Authentifizierung und APIs cachen darf
Ein typischer Fehler ist aggressives Caching, das die Authentifizierung beeinträchtigt.
Hier ist der Ansatz von Kazki AI: Wir cachen nur statische Dateien von Ihrer Domain
(Stile, Skripte, Bilder, Schriftarten), aber HTML-Seiten, APIs und
Authentifizierung werden überhaupt nicht angerührt:
const CACHE_NAME = 'static-v1';
const STATIC_DESTINATIONS = ['style', 'script', 'image', 'font'];
self.addEventListener('fetch', event => {
const request = event.request;
const url = new URL(request.url);
// Nicht cachen: Nicht-GET, fremde Domains, APIs
if (request.method !== 'GET') return;
if (url.origin !== self.location.origin) return;
if (url.pathname.startsWith('/api/')) return;
// HTML-Seiten (Login, Dashboard, Profil usw.) kommen immer aus dem Netzwerk –
// nur statische Ressourcen werden gecacht
if (!STATIC_DESTINATIONS.includes(request.destination)) return;
// Network-first, Fallback zum Cache
event.respondWith(
fetch(request)
.then(response => {
if (response.ok) {
const clone = response.clone();
caches.open(CACHE_NAME)
.then(cache => cache.put(request, clone));
}
return response;
})
.catch(() => caches.match(request))
);
});
Wenn die Anmeldeseite gecacht wird – sieht der Benutzer eine veraltete
Version oder bleibt in einem gecachten Zustand nach dem Abmelden stecken.
Der Kompromiss dieses Ansatzes: Der Offline-Modus für HTML-Seiten funktioniert nicht.
Wenn Sie ihn benötigen, fügen Sie eine separate Offline-Platzhalterseite hinzu.
Mehr über typische Caching-Fehler in PWAs – einschließlich aggressiven
Cachings von HTML und Routing-Problemen – lesen Sie im Artikel
8 kritische Fehler bei der PWA-Integration
.
💼 Kapitel 6. Push-Handler: try/catch-Fallback und iOS-spezifische Details aus einem realen Projekt
Jedes Push-Ereignis in einem Service Worker muss mit der Anzeige
einer Benachrichtigung enden, und die Payload muss sicher verarbeitet werden: Wenn die Daten
nicht im JSON-Format ankommen, stürzt der Code ohne try/catch ab, die Benachrichtigung wird nicht angezeigt,
und iOS kann das Abonnement kündigen.
iOS unterstützt keine „stillen“ Push-Benachrichtigungen: Wenn ein Service Worker ein Push-Ereignis empfängt und keine Benachrichtigung anzeigt, kann Safari das Abonnement widerrufen. Laut Entwicklerberichten geschieht dies bereits nach wenigen solchen Fällen. Daher
sind event.waitUntil mit showNotification und ein korrekter
Fallback für die Payload entscheidend.
[Apple Developer: Senden von Web-Push-Benachrichtigungen]
Wenn der Service Worker nach einem Push-Ereignis keine Benachrichtigung anzeigt –
interpretiert iOS dies als „stille Push-Benachrichtigung“ und kann das Abonnement widerrufen.
[dev.to: iOS-Push-Abonnements nach 3 Benachrichtigungen beendet]
Vollständiger Push-Handler von Kazki AI mit Erklärungen:
self.addEventListener('push', event => {
// try/catch – die Payload ist möglicherweise kein JSON (Fehler auf dem Server, Test-Push)
let data = {};
try {
data = event.data?.json() ?? {};
} catch (e) {
data = { title: 'Kazki AI', body: event.data?.text() ?? '' };
}
// Badging API – Zähler auf dem Icon. Ein Fehler beim Badge darf die
// Anzeige der Benachrichtigung nicht beeinträchtigen, daher wird er mit catch abgefangen.
const badgePromise = self.navigator?.setAppBadge
? self.navigator.setAppBadge(data.badgeCount || 1).catch(() => {})
: Promise.resolve();
// event.waitUntil + showNotification – OBLIGATORISCH für jedes Push-Ereignis,
// andernfalls kann iOS das Abonnement kündigen
event.waitUntil(
Promise.all([
self.registration.showNotification(data.title || 'Kazki AI', {
body: data.body || '',
icon: data.icon || '/images/favicon.jpg',
badge: '/images/favicon.jpg',
data: { url: data.url || '/dashboard' }
}),
badgePromise
])
);
});
// Klick auf die Benachrichtigung – öffnet die gewünschte Seite
self.addEventListener('notificationclick', event => {
event.notification.close();
const targetUrl = new URL(
event.notification.data?.url || '/dashboard',
self.location.origin
).href;
event.waitUntil((async () => {
if (self.navigator?.clearAppBadge) {
await self.navigator.clearAppBadge().catch(() => {});
}
// Wenn die Anwendung bereits geöffnet ist – wechselt sie, anstatt ein neues Fenster zu öffnen
const windowClients = await clients.matchAll({ type: 'window', includeUncontrolled: true });
for (const client of windowClients) {
if ('focus' in client) {
await client.focus();
if ('navigate' in client) await client.navigate(targetUrl);
return;
}
}
await clients.openWindow(targetUrl);
})());
});
Struktur der vom Backend gesendeten Payload (Spring Boot + nl.martijndwars/web-push):
{
"title": "Neues Märchen fertig!",
"body": "Dein Märchen über den Drachen wartet schon",
"icon": "/images/favicon.jpg",
"url": "/library",
"badgeCount": 1
}
Das Feld badgeCount muss die aktuelle Anzahl ungelesener
Benachrichtigungen enthalten, die vom Server gezählt wird: Der Service Worker kennt den vorherigen Wert nicht.
💼 Kapitel 7. 7 Gründe, warum Push-Benachrichtigungen auf dem iPhone nicht ankommen – und wie man sie behebt
Die meisten Probleme mit iOS PWA Push
sind nicht serverseitig, sondern liegen darin, wie der Client-Code mit den
Einschränkungen von Safari interagiert.
Probleme mit Push-Abonnements auf iOS sind eines der am häufigsten diskutierten
Themen in den Apple Developer Foren. Hier sind sieben häufige Gründe
mit konkreten Lösungen.
[Apple Developer Foren: PWA Push Probleme]
1. PWA ist nicht auf dem Home-Bildschirm installiert
Der häufigste Grund. Die Push-API ist nicht verfügbar, solange die Anwendung
nicht als Home Screen Web App (Standalone-Modus) geöffnet ist. Lösung:
eine UI-Eingabeaufforderung mit der Anleitung „Teilen → Zum Home-Bildschirm hinzufügen“ hinzufügen.
2. Service Worker zeigt nach dem Push-Ereignis keine Benachrichtigung an
iOS interpretiert einen Push ohne showNotification als „stumm“
und kann das Abonnement nach mehreren solchen Fällen kündigen. Lösung:
immer showNotification innerhalb von
event.waitUntil aufrufen, auch wenn die Payload leer oder ungültig ist.
[dev.to: iOS-Push-Benachrichtigungen nach 3 Benachrichtigungen beendet]
3. VAPID-Betreff im falschen Format
Der Betreff in VAPID muss eine mailto:-Adresse oder eine HTTPS-URL sein.
Wenn er falsch ist, kann Apple die Anfrage ablehnen
(z. B. mit dem Status 403 Forbidden von
web.push.apple.com). Lösung: Überprüfen Sie
vapid.subject in der Serverkonfiguration.
[Longsight: Implementierung plattformübergreifender Push-Benachrichtigungen]
4. Abonnement nach erneuter Authentifizierung "verschwunden"
Wenn das Frontend während des Logouts subscription.unsubscribe() aufruft,
kann eine erneute stille Anmeldung nicht mehr erfolgen: Auf iOS benötigt ein neues
subscribe() eine neue Benutzergeste, d. h. der Benutzer muss erneut auf die Schaltfläche klicken. Nach Erfahrung von Entwicklern ist es am zuverlässigsten, das Abonnement beim Abmelden nicht zu kündigen, sondern es nur auf dem Server als inaktiv zu markieren und nach der nächsten Anmeldung mit dem Konto zu verknüpfen.
[XenForo: Verlorene Push-Abonnements iOS PWA]
5. HTTP statt HTTPS
Service Worker und Push-API erfordern einen sicheren Kontext, d. h. HTTPS
(die einzige Ausnahme ist localhost während der Entwicklung; auf dem iPhone
ist für Tests eine echte HTTPS-Domain erforderlich). Eine separate Fallstrick:
Die Service Worker-Datei kann nicht über eine Weiterleitung bereitgestellt werden – die Registrierung schlägt in diesem Fall fehl. Lösung: Stellen Sie sicher, dass die gesamte Website,
einschließlich statischer Dateien und der SW-Datei, über HTTPS ohne Weiterleitungen
zum Skript selbst bedient wird.
6. Berechtigungsanfrage wird nicht durch Benutzergeste ausgelöst
Wenn Notification.requestPermission() in
setTimeout, DOMContentLoaded oder
einem beliebigen automatischen Code aufgerufen wird – funktioniert die Anfrage auf iOS nicht.
Lösung: Ausschließlich im Klick-Handler auf die Schaltfläche aufrufen.
[pwa.io: Web Push iOS Safari 16.4 leicht gemacht]
7. Endpunkt gab 410 oder 404 zurück – Abonnement nicht aus der DB gelöscht
Wenn ein Abonnement ungültig wird, gibt der Push-Dienst den Status
410 Gone oder 404 zurück. Wenn dieser Endpunkt nicht aus der Datenbank gelöscht wird – werden zukünftige Versuche, Push-Benachrichtigungen an diesen
Benutzer zu senden, Ressourcen verschwenden. Lösung: Genau diese
Statuscodes verarbeiten und das Abonnement automatisch löschen. Andere Fehler
(400, 401, 403, 413)
bedeuten normalerweise ein Problem mit Ihrer Anfrage – VAPID, Payload oder deren
Größe –, daher sollten Abonnements aufgrund dieser Fehler nicht gelöscht werden: Sie könnten aktive Abonnenten verlieren.
// Spring Boot: Verarbeitung ungültiger Abonnements
if (statusCode == 410 || statusCode == 404) {
pushSubscriptionRepository.deleteByEndpoint(sub.getEndpoint());
log.info("Ungültiges Abonnement gelöscht: {}", sub.getEndpoint());
} else if (statusCode >= 400) {
// Nicht löschen: Wahrscheinlich ein Problem mit VAPID, Payload oder Konfiguration
log.warn("Push nicht zugestellt, Status {} für {}", statusCode, sub.getEndpoint());
}
🧩 Fertige Dienste anstelle eines eigenen Backends: Wann das sinnvoll ist
Alles, was oben beschrieben wurde, habe ich selbst implementiert: VAPID-Schlüssel, Speicherung von Abonnements und Versand über eine Spring Boot-Bibliothek. Viele Probleme aus der Liste der sieben Gründe (ungültige Abonnements, VAPID, Statusverarbeitung) liegen im Backend, daher stellt sich die natürliche Frage: Warum nicht diesen Teil an einen fertigen Dienst übergeben? Nachfolgend finden Sie einen kurzen Überblick über fünf beliebte Optionen. Ich habe sie nicht selbst in der Produktion eingesetzt, daher basiert der Vergleich auf ihrer offiziellen Dokumentation und nicht auf meiner eigenen Erfahrung. Eine detaillierte Analyse wird in einem separaten Artikel veröffentlicht: Push-Dienste für PWA: OneSignal, FCM, Pushwoosh, WonderPush und Braze.
Was der Dienst nicht ändert
Das Wichtigste: Ein fertiger Dienst hebt die Einschränkungen von iOS nicht auf. Die Dokumentation aller geprüften Dienste beschreibt dieselben Bedingungen wie in diesem Artikel:
- Für FCM unter iOS und iPadOS muss die Anwendung zum Startbildschirm hinzugefügt werden.
- Braze gibt an, dass die Erlaubnis für Push-Benachrichtigungen in Safari unter iOS nur nach dem Hinzufügen der Website zum Startbildschirm und nur als Reaktion auf eine Benutzeraktion angefordert werden kann.
- OneSignal erfordert iOS 16.4 oder neuer, das Hinzufügen zum Startbildschirm und das Öffnen der Anwendung von dort aus. Außerdem wird ausdrücklich darauf hingewiesen, dass bei einigen iOS-Entwicklern Web-Push zunächst funktioniert und dann plötzlich stoppt.
Das bedeutet, der Dienst übernimmt einen Teil der Backend-Arbeit, aber die Installation auf dem Startbildschirm, die Erlaubnisanfrage per Klick und die Instabilität von Abonnements unter iOS bleiben bestehen.
Vergleich der Dienste
| Dienst |
Typ |
iOS Web Push (laut Dokumentation) |
Was zu beachten ist |
| Firebase Cloud Messaging (FCM) |
Lieferinfrastruktur von Google |
Ja. Safari unter iOS und iPadOS 16.4+, die Anwendung muss auf dem Startbildschirm sein (Firebase Blog) |
Dies ist näher an einem eigenen Backend: Der Dienst liefert Nachrichten, aber die Logik für Kampagnen und Segmentierung bauen Sie selbst. Prüfen Sie die Möglichkeiten der Konsole in der Firebase-Dokumentation. |
| OneSignal |
Push-Marketing-Plattform (SaaS) |
Ja. iOS 16.4+, jeder Browser mit der Option "Zum Startbildschirm hinzufügen" (Safari, Chrome, Edge). Der OneSignal Service Worker ist obligatorisch (Dokumentation) |
Ihr eigener Service Worker (Caching, Push-Handler) muss mit dem Service-Worker des Dienstes kombiniert werden. Es gibt eine API zum Erstellen von Nachrichten. |
| Pushwoosh |
Push-Marketing-Plattform (SaaS) |
[Pushwoosh-Dokumentation] |
[] |
| WonderPush |
Push-Marketing-Plattform (SaaS) |
Ja. Kompatibilität mit iOS 16.4 wurde am Tag der Veröffentlichung, dem 24. März 2023, angekündigt (WonderPush Blog) |
Ein Manifest mit "display": "standalone" ist erforderlich: Wenn Sie keines haben, fügt der Dienst ein eigenes hinzu. Laut Dokumentation sind iOS-Benachrichtigungen Text-basiert, ohne Bilder oder Schaltflächen (die Seite wurde lange nicht aktualisiert, bitte prüfen Sie). |
| Braze |
Enterprise-Level Customer Engagement Platform (CEP) |
Ja. Ein Manifest, ein Service Worker mit der Braze-Bibliothek und das Hinzufügen zum Startbildschirm sind erforderlich (Dokumentation) |
Eine Lösung für große Teams und kanalübergreifende Kampagnen. Überprüfen Sie die Nutzungsbedingungen und Preise auf der offiziellen Website. Wenn ein Benutzer die Erlaubnisanfrage abgelehnt hat, kann sie erst wieder angezeigt werden, nachdem die Anwendung vom Startbildschirm entfernt und erneut hinzugefügt wurde. |
Preise sind bewusst nicht in der Tabelle enthalten: Sie ändern sich, daher überprüfen Sie sie auf den offiziellen Seiten jedes Dienstes.
Wann es sich lohnt, einen Dienst zu nutzen, und wann man beim eigenen Backend bleiben sollte
Ein Dienst ist sinnvoll, wenn:
- keine Zeit oder Ressourcen vorhanden sind, um den eigenen Versand und die Bereinigung von Abonnements aufrechtzuerhalten;
- Segmentierung, Analysen und Kampagnen benötigt werden, die das Marketingteam ohne Entwickler durchführt;
- Benachrichtigungen gleichzeitig vom Web und von nativen Anwendungen gesendet werden müssen.
Ein eigenes Backend bleibt eine vernünftige Wahl, wenn:
- das Szenario einfach ist, wie bei Kazki AI ("neues Märchen ist fertig");
- es wichtig ist, dass die Abonnentendaten Ihre Infrastruktur nicht verlassen;
- Sie minimale Abhängigkeiten und die volle Kontrolle über die Versandlogik wünschen.
Was vor der Auswahl zu prüfen ist
- Anteil der iOS-Zielgruppe. Sehen Sie in Ihrer eigenen Analyse nach, wie viele Benutzer tatsächlich mit dem iPhone auf die Website zugreifen, da nur für sie alle Einschränkungen dieses Artikels gelten.
- Service Worker-Konflikt. Das SDK des Dienstes erfordert einen eigenen Worker (OneSignal) oder den Import einer eigenen Bibliothek (Braze). Wenn Sie bereits eigenes Caching und einen Push-Handler haben, müssen diese sorgfältig kombiniert werden.
- Anbieterbindung. Abonnements werden beim Dienst gespeichert, daher bedeutet ein Wechsel zu einem anderen Anbieter oder zu einem eigenen Backend, dass ein Teil der Benutzer erneut abonnieren muss. Dies ist meine Annahme aufgrund der Spezifikationen von Web Push (das Abonnement ist an Schlüssel und Anbieter gebunden), prüfen Sie dies für Ihren eigenen Fall.
- Daten und Datenschutz. Überprüfen Sie, wo die Abonnentendaten gespeichert werden und wie dies mit Ihrer Datenschutzrichtlinie übereinstimmt.
- Neue iOS-Funktionen. Wenn Sie Declarative Web Push (iOS 18.4+) planen, klären Sie dies in der Dokumentation.
💼 Abschnitt 8. Workarounds und Fallback-Strategien
Wenn PWA Push unter iOS nicht für Ihren Anwendungsfall geeignet ist – E-Mail und In-App-Benachrichtigungen bleiben eine zuverlässigere Alternative, da sie nicht von der PWA-Installation und dem Status des Push-Abonnements abhängen.
PWA Push unter iOS funktioniert, hat aber Einschränkungen: Es erfordert die Installation auf dem Startbildschirm, es kann zu Abonnementverlusten kommen, und die Zustellungsstabilität ist nach Erfahrung von Entwicklern geringer als unter Android und in nativen Apps. Für kritische Benachrichtigungen sollten Sie eine Fallback-Strategie haben.
Ein zuverlässiges Benachrichtigungssystem ist keine Wahl zwischen Push und E-Mail, sondern eine Kombination von Kanälen mit intelligenter Degradation.
E-Mail als primäres Fallback
E-Mail ist unabhängig von der iOS-Version oder dem Status der PWA-Installation, und die Zustellung kann verfolgt werden (Bounce, Öffnungen, Beschwerden). Für transaktionale Benachrichtigungen (Zahlung, Bestätigung, wichtige Ereignisse) ist dies der zuverlässigere Kanal. Einschränkungen: Er funktioniert nur für Benutzer, deren E-Mail-Adresse Sie haben, und die Zustellung hängt von der Reputation Ihrer Domain ab (SPF, DKIM, DMARC).
In-App-Benachrichtigungen
Ein Zähler für ungelesene Nachrichten im Header, ein Ereignisstrom innerhalb der Anwendung – das ist es, was der Benutzer garantiert sieht, wenn er die PWA das nächste Mal öffnet, unabhängig vom Status des Push-Abonnements.
Kombinierter Ansatz mit Kazki AI
Kazki AI verwendet ein mehrstufiges System:
- Push-Benachrichtigungen – für Benutzer, die die PWA installiert und Benachrichtigungen erlaubt haben.
- Badge auf dem Symbol (Badging API) – für installierte PWAs, als Ergänzung zu Push.
- In-App-Ereignisstrom – für alle, die die Anwendung öffnen.
- E-Mail – für alle Benutzer als Fallback und primärer Kanal für transaktionale Nachrichten.
Eine solche Kombination erweitert die Reichweite erheblich: Ein Benutzer, der die PWA nicht installiert oder Push nicht erlaubt hat, erhält trotzdem wichtige Informationen per E-Mail und In-App. Kein Kanal kann eine 100%ige Reichweite garantieren, aber je mehr unabhängige Kanäle es gibt, desto geringer ist die Wahrscheinlichkeit, dass eine Benachrichtigung verloren geht.
Mehr über die Wahl zwischen PWA und nativer App erfahren Sie in der detaillierten Vergleichsstudie mit realen Zahlen im Artikel
PWA vs. Native in 2026: Vergleich und realer Fall
.
❓ Häufig gestellte Fragen (FAQ)
Funktioniert Web Push unter iOS ohne PWA-Installation?
Nein. Die Push API unter iOS ist nur für Home Screen Web Apps verfügbar – d.h. für Websites, die über das Teilen-Menü ("Teilen" → "Zum Startbildschirm hinzufügen") zum Startbildschirm hinzugefügt wurden. Eine offene Registerkarte in Safari oder einem anderen Browser ermöglicht kein Push-Abonnement.
[WebKit Blog: Web Push for Web Apps on iOS]
Funktioniert PWA Push über Chrome auf dem iPhone?
Ja, aber mit einer Einschränkung. Es ist nicht möglich, sich von einer Chrome-Registerkarte aus für Push-Benachrichtigungen anzumelden, genauso wenig wie von einer Safari-Registerkarte. Ab iOS 16.4 können Drittanbieter-Browser jedoch "Zum Startbildschirm hinzufügen" im Teilen-Menü anbieten, und eine auf diese Weise hinzugefügte Website wird als Home Screen Web App geöffnet und hat dieselbe Push-Unterstützung. Das Vorhandensein dieses Punktes hängt vom jeweiligen Browser ab, daher ist es in den Anweisungen für Benutzer zuverlässiger, den Pfad "Teilen" → "Zum Startbildschirm hinzufügen" anzugeben. Es ist auch wichtig zu wissen, dass Browser unter iOS standardmäßig WebKit verwenden; in der EU erlaubt Apple ab iOS 17.4 auch alternative Engines.
[WebKit Blog: Web Push for Web Apps on iOS]
Ab welcher iOS-Version wird Web Push für PWA unterstützt?
Ab iOS 16.4 (März 2023). In Versionen vor 16.4 ist Web Push für PWA
nicht verfügbar, unabhängig vom Browser oder den Einstellungen. Da die meisten
aktiven iPhones längst auf Version 16.4 aktualisiert sind, ist die iOS-Version
heute selten ein Grund für Probleme; den genauen Anteil Ihrer Zielgruppe können
Sie in Ihrer eigenen Analyse einsehen.
[WebKit Blog: Web Push iOS 16.4]
Warum verschwindet das Abonnement nach einigen Tagen?
Es gibt mehrere Gründe, über die Entwickler berichten. Erstens kann iOS
das Abonnement kündigen, wenn der Service Worker Push-Ereignisse erhalten hat,
aber keine Benachrichtigungen angezeigt hat. Zweitens kann das Abonnement nach längerer Inaktivität
der Anwendung ungültig werden (der Server erhält 410
oder 404). Lösung: Rufen Sie immer
showNotification in event.waitUntil auf,
prüfen Sie die Aktualität des Abonnements bei jeder Öffnung der Anwendung und
senden Sie es erneut an den Server.
[dev.to: iOS push subscriptions terminated]
Wie hoch ist die Zustellungsrate von PWA Push unter iOS im Vergleich zu Android?
Es gibt keine universelle Zahl: Es gibt wenige unabhängige öffentliche Daten, und das Ergebnis hängt von Ihrer Zielgruppe und dem Anteil "toter" Abonnements ab. Nach Erfahrung von Entwicklern ist die Zustellung unter iOS schlechter als unter Android: strengere Safari-Regeln für Benachrichtigungen und Abonnements, die nach
Inaktivität ungültig werden. Am zuverlässigsten ist es, Ihren eigenen Wert zu messen: Vergleichen Sie
die Anzahl der erfolgreichen Zustellungen (2xx-Antworten) mit der Gesamtzahl der
Abonnements und zählen Sie separat, wie viele Abonnements aufgrund von
410/404 gelöscht werden.
[OneSignal: iOS Web Push]
Kann man einen Push ohne Bibliothek im Backend senden?
Technisch ja – das Web Push Protocol ist ein offener Standard. Aber
die eigenständige Implementierung von VAPID-Signierung und Payload-Verschlüsselung ist komplex
und fehleranfällig. Für Java/Spring Boot können Sie die Bibliothek
nl.martijndwars:web-push verwenden
(sie benötigt auch einen BouncyCastle-Provider: registrieren Sie ihn vor dem Senden
über Security.addProvider(new BouncyCastleProvider())),
für Node.js – web-push.
<!-- Maven: Abhängigkeit für Java/Spring Boot.
Prüfen Sie die aktuelle Version auf Maven Central -->
<dependency>
<groupId>nl.martijndwars</groupId>
<artifactId>web-push</artifactId>
<version>5.1.1</version>
</dependency>
Wie generiert man VAPID-Schlüssel?
Der einfachste Weg ist über das web-push CLI:
npx web-push generate-vapid-keys
Der öffentliche Schlüssel wird im Frontend beim Abonnieren verwendet,
der private – im Backend zum Signieren jeder Push-Anfrage.
Veröffentlichen Sie niemals den privaten Schlüssel in einem öffentlichen Repository.
Generieren Sie ein Paar einmal und speichern Sie es: bestehende Abonnements sind
an den öffentlichen Schlüssel gebunden, daher müssen Benutzer nach dessen Änderung
erneut abonnieren.
✅ Fazit: Wann PWA Push unter iOS ausreicht und wann Native besser ist
PWA Push unter iOS funktioniert und ist für
die meisten Content- und SaaS-Produkte geeignet. Für kritische Benachrichtigungen
in Fintech, Medizin oder E-Commerce mit einem hohen Anteil an iOS-Nutzern
sollte man entweder mit E-Mail kombinieren oder Native in Betracht ziehen.
Seit iOS 16.4 ist die technische Hürde beseitigt. Übrig bleibt die operative:
Der Benutzer muss die PWA zum Startbildschirm hinzufügen und Benachrichtigungen erlauben –
und das ist die Haupteinschränkung, die nicht auf Code-Ebene gelöst werden kann.
PWA Push unter iOS ist kein "entweder es funktioniert oder nicht". Es ist ein Werkzeug
mit spezifischen Arbeitsbedingungen. Wenn diese Bedingungen erfüllt sind –
es funktioniert ausreichend zuverlässig für Informationsbenachrichtigungen.
PWA Push unter iOS ist geeignet, wenn:
- Ihr Produkt ist Content-basiert: Nachrichten, Medien, Bildung, SaaS
- Die Zielgruppe ist loyal und bereit, die PWA zum Startbildschirm hinzuzufügen
- Die Benachrichtigungen sind informativ, nicht kritisch (Erinnerungen, Nachrichten, Updates)
- Es gibt E-Mail als Fallback für diejenigen, die die PWA nicht installiert haben
- Das Budget erlaubt nicht die parallele Entwicklung einer nativen Anwendung
Native oder Hybrid sollten in Betracht gezogen werden, wenn:
- Die Benachrichtigungen sind kritisch: Banktransaktionen, medizinische Alarme
- Der Anteil von iOS an Ihrer Zielgruppe ist hoch (Richtwert – über die Hälfte der Benutzer)
- Hintergrundprozesse oder Echtzeit-Geolokalisierung sind erforderlich
- Die Präsenz im App Store ist Teil der Marketingstrategie
Fazit aus der Erfahrung von Kazki AI
Bei Kazki AI funktioniert PWA Push unter iOS zufriedenstellend für Informations-
Benachrichtigungen – "neues Märchen ist fertig", "Erinnerung an das Abonnement".
Die Zustellung unter iOS ist weniger stabil als unter Android, aber für ein Produkt akzeptabel,
bei dem die Kritikalität der Zustellung nicht hoch ist. E-Mail bleibt der primäre
Kanal für transaktionale Benachrichtigungen.
Wenn Sie noch zwischen PWA und nativer App wählen und sich nicht für
die Architektur entschieden haben – ein detaillierter Vergleich mit realen Zahlen im Artikel
PWA vs. Native in 2026: Vergleich und realer Fall
.
📖 Quellen