PWA Push-Benachrichtigungen auf iOS im Jahr 2026: Was wirklich funktioniert

Aktualisiert:
✦ KI zu diesem Artikel befragen
PWA Push-Benachrichtigungen auf iOS im Jahr 2026: Was wirklich funktioniert

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.

PWA Push-Benachrichtigungen auf iOS im Jahr 2026: Was wirklich funktioniert — 2

🎯 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:

    1. Push-Benachrichtigungen – für Benutzer, die die PWA installiert und Benachrichtigungen erlaubt haben.
    2. Badge auf dem Symbol (Badging API) – für installierte PWAs, als Ergänzung zu Push.
    3. In-App-Ereignisstrom – für alle, die die Anwendung öffnen.
    4. 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