SW Shopware 6 Mittel

DfPwaPush — Vollständiger Leitfaden

Verwandeln Sie Ihren Shopware-Shop in eine installierbare PWA und versenden Sie selbst gehostete Web-Push-Benachrichtigungen (VAPID, ohne Firebase, ohne Composer-Abhängigkeit) für Shopware 6.5, 6.6 und 6.7.

Aktualisiert Modulversion 1.0.2

DfPwaPush vereint zwei Funktionen in einem einzigen Shopware-Plugin: Es verwandelt Ihre Storefront in eine installierbare Progressive Web App (Manifest, Service Worker, Offline-Seite, Installations-Banner) und ermöglicht Ihnen, Ihre Kunden mit vollständig selbst gehosteten Web-Push-Benachrichtigungen zu reaktivieren. Kein Drittanbieter-Dienst (kein Firebase, kein OneSignal), keine Composer-Abhängigkeit: Die Web-Push-Verschlüsselung (RFC 8291) und die VAPID-Signatur (RFC 8292) sind nativ mit den von Shopware ohnehin verlangten Erweiterungen OpenSSL und cURL implementiert. Alle Abonnementdaten bleiben auf Ihrem Server. Dieser Leitfaden behandelt Installation, PWA- und Push-Konfiguration, VAPID-Schlüsselgenerierung, Erstellung und Versand von Kampagnen, Hintergrundausführung und Fehlerbehebung.

Installation

  1. Laden Sie das Archiv DfPwaPush-1.0.2.zip aus Ihrem DataFirefly-Konto herunter.
  2. Installieren Sie es über Administration → Erweiterungen → Meine Erweiterungen → Erweiterung hochladen, oder kopieren Sie den entpackten Ordner DfPwaPush nach custom/plugins/.
  3. Führen Sie Installation und Aktivierung aus:
    bin/console plugin:refresh
    bin/console plugin:install --activate DfPwaPush
    bin/console cache:clear
  4. Bei der Installation erstellt das Plugin seine beiden Tabellen (df_push_subscription und df_push_campaign) und registriert seine Versand-ScheduledTask.

Kompatibel mit Shopware 6.5.x, 6.6.x und 6.7.x auf einer einzigen Codebasis. Das Administrationsmodul wird vorkompiliert ausgeliefert und das Storefront-JavaScript wird per Twig eingebunden: Es ist kein Build erforderlich, weder build-administration.sh noch ein Storefront-Build. Erforderliche PHP-Erweiterungen: openssl und curl, beide von Shopware ohnehin verlangt. Keine zusätzliche Composer-Abhängigkeit.

HTTPS-Voraussetzung

Service Worker und die Web-Push-API existieren nur auf einem sicheren Origin. Ihr Shop muss über HTTPS ausgeliefert werden (nur localhost ist in der Entwicklung eine Ausnahme). In einem HTTP-Shop bleibt das Plugin im Frontend stumm und protokolliert dies in der Browser-Konsole.

Wo Sie das Plugin in der Administration finden

Nach der Aktivierung erscheint ein Eintrag Push-Kampagnen im Menü Marketing der Administration. Dort erstellen, planen und verfolgen Sie Ihre Kampagnen. Die gesamte PWA- und Push-Konfiguration erfolgt in der Plugin-Konfiguration, pro Verkaufskanal, über Erweiterungen → Meine Erweiterungen → DfPwaPush → ⋯ → Konfigurieren.

Falls der Menüeintrag nach einem Update nicht erscheint, führen Sie bin/console assets:install && bin/console cache:clear aus und laden die Administration mit erzwungenem Cache neu (Strg+Umschalt+R).

Generierung der VAPID-Schlüssel

Web Push beruht auf einem VAPID-Schlüsselpaar (Standard RFC 8292), das Ihren Server gegenüber den Push-Diensten der Browser authentifiziert. Generieren Sie sie mit einem Befehl:

bin/console df:pwa-push:vapid:generate

Die Schlüssel werden direkt in die Plugin-Konfiguration geschrieben. Verwenden Sie die Option --force, um sie zu regenerieren. Sie können auch vorhandene VAPID-Schlüssel in die Konfigurationsfelder einfügen.

Das Regenerieren der VAPID-Schlüssel macht alle bestehenden Abonnements ungültig: Bereits abonnierte Browser erhalten keine Benachrichtigungen mehr und müssen sich erneut abonnieren. Tun Sie dies nur bewusst.

PWA-Konfiguration

Die Karte PWA in der Konfiguration (pro Verkaufskanal einstellbar) steuert die Installierbarkeit Ihres Shops:

  • PWA aktivieren: liefert das Manifest und den Service Worker aus.
  • App-Name und Kurzname: auf dem Startbildschirm nach der Installation angezeigt.
  • Themenfarbe / Hintergrundfarbe: standardmäßig #0f172a für das Thema.
  • Anzeigemodus: standalone, minimal-ui, fullscreen oder browser.
  • Icons 192 px und 512 px: PNG-Uploads, unverzichtbar für die Installierbarkeit.
  • Installations-Banner: aktiviert die Aufforderung „Zum Startbildschirm hinzufügen“.

Ohne die beiden Icons 192 px und 512 px betrachtet Chrome die Website nicht als installierbar und das Installations-Banner erscheint nie. Das ist die häufigste Ursache für eine PWA, die im Frontend „nichts tut“.

Push-Konfiguration

Die Karte Push steuert die Benachrichtigungen:

  • Web Push aktivieren: aktiviert das Opt-in-Banner und die Subscription-Endpunkte. Standardmäßig aktiviert.
  • Öffentlicher / privater VAPID-Schlüssel: vom obigen Befehl generiert.
  • VAPID-Subject: eine mailto:-Adresse oder die URL Ihrer Website.
  • Opt-in-Verzögerung: Anzahl der Sekunden, bevor das Berechtigungs-Banner erscheint (standardmäßig 8).

Der Service Worker und die Storefront-Endpunkte

Alle PWA-Ressourcen werden dynamisch von einem Controller ausgeliefert, was sie immun gegen den Wechsel von webpack zu Vite in 6.7 macht:

  • GET /df-pwa/manifest.json — das PWA-Manifest, pro Verkaufskanal generiert.
  • GET /df-pwa/sw.js — der Service Worker (Header Service-Worker-Allowed: /, um den gesamten Origin zu steuern).
  • GET /df-pwa/icon/{192|512} — die PWA-Icons.
  • GET /df-pwa/offline — die Offline-Ersatzseite, vom Service Worker gecacht.
  • POST /df-pwa/subscribe und POST /df-pwa/unsubscribe — Speichern und Entfernen eines Abonnements (XHR).

Der Service Worker cacht die Offline-Seite bei der Installation, liefert einen Ersatz für fehlgeschlagene Navigationen und zeigt empfangene Benachrichtigungen über das push-Ereignis mit Klick-Weiterleitung zur Kampagnen-URL an.

Eine Kampagne erstellen und versenden

  1. Gehen Sie zu Marketing → Push-Kampagnen → Kampagne erstellen.
  2. Füllen Sie Titel, Nachricht und optional eine Ziel-URL und ein Icon aus.
  3. Beschränken Sie die Kampagne bei Bedarf auf einen Verkaufskanal (andernfalls werden alle Abonnenten angesprochen).
  4. Legen Sie entweder ein geplantes Datum fest und speichern, oder klicken Sie auf Jetzt senden.

„Jetzt senden“ stellt die Kampagne sofort in die Warteschlange (Status scheduled mit einem Sendedatum zum aktuellen Zeitpunkt); die geplante Aufgabe übernimmt sie innerhalb weniger Minuten. Eine Kampagne durchläuft die Status draftscheduledsendingsent (oder failed), und die Seite zeigt die Zähler für erfolgreiche und fehlgeschlagene Sendungen an.

Hintergrundversand: ScheduledTask und CLI

Der Kampagnenversand wird von der ScheduledTask df_pwa_push.send_campaigns übernommen, die alle 300 Sekunden läuft. Sie holt fällige geplante Kampagnen und versendet sie in Stapeln. Sie können den Versand auch manuell auslösen:

bin/console df:pwa-push:send

Wie jede Shopware-ScheduledTask hängt der Versand von einem aktiven Worker ab. Stellen Sie sicher, dass ein Messenger-Consumer läuft (bin/console messenger:consume) oder dass der Shopware-Scheduler regelmäßig ausgelöst wird, sonst gehen geplante Kampagnen nicht raus.

Natives Web Push, keine Abhängigkeit

DfPwaPush implementiert den kompletten Web-Push-Stack in reinem PHP, ohne externe Bibliothek:

  • VAPID / ES256 (RFC 8292): P-256-Schlüsselgenerierung über OpenSSL und ES256-JWT-Signatur zur Authentifizierung des Servers.
  • aes128gcm-Verschlüsselung (RFC 8291): ephemeres ECDH, HKDF-Ableitung und AES-128-GCM-Verschlüsselung der Nachricht für jeden Abonnenten.
  • Paralleler Versand per curl_multi in Stapeln, mit Behandlung der Rückgabecodes der Push-Dienste.

Die Implementierung wird Byte für Byte gegen den offiziellen Testvektor des RFC 8291 validiert, was die Interoperabilität mit Chrome, Firefox, Edge und Safari garantiert.

Automatische Bereinigung der Abonnements

Wenn ein Push-Dienst meldet, dass ein Abonnement nicht mehr existiert (HTTP-Codes 404 oder 410), wird das entsprechende Abonnement automatisch deaktiviert. Abonnements, die wiederholt fehlschlagen (5 aufeinanderfolgende Fehlversuche), werden ebenfalls deaktiviert. Ihre Abonnentenbasis bleibt ohne Eingriff sauber.

iOS- und Safari-Kompatibilität

Auf iOS erfordert Web Push iOS 16.4 oder höher und die Installation der PWA auf dem Startbildschirm: Safari liefert keine Push-Benachrichtigungen an einen einfachen Tab. Das Plugin behandelt diesen Fall sauber — das Opt-in-Banner erscheint nur, wenn die Push-API tatsächlich verfügbar ist, sodass Ihren iOS-Besuchern kein falsches Versprechen gemacht wird.

FAQ und Fehlerbehebung

Die ZIP-Installation schlägt mit „Paket minishlink/web-push fehlt“ fehl. Dieser Fehler betraf frühere Versionen. Seit 1.0.1 ist Web Push nativ und das Plugin hat keine Composer-Abhängigkeit mehr: Die aktuelle Version lässt sich auf jedem Hosting installieren, auch auf Shared Hosting.

Im Backend erscheint nichts zum Erstellen von Kampagnen. Das Administrationsmodul ist seit 1.0.1 vorkompiliert. Führen Sie nach einem Update bin/console assets:install && bin/console cache:clear aus und laden die Administration mit erzwungenem Cache neu (Strg+Umschalt+R). Der Eintrag befindet sich unter Marketing → Push-Kampagnen.

Die URL /df-pwa/manifest.json liefert einen 500-Fehler. Behoben in 1.0.2: Die Methode setTwig() des übergeordneten Controllers wurde in Shopware 6.7 entfernt, wodurch alle /df-pwa/*-Routen fehlschlugen. Aktualisieren Sie auf 1.0.2 oder höher.

Im Storefront passiert nichts. Öffnen Sie die Browser-Konsole: Das Plugin protokolliert jede Entscheidung mit dem Präfix [DfPwaPush] (Service Worker registriert oder nicht, fehlender VAPID-Schlüssel, Berechtigung verweigert, iOS ohne installierte PWA…). Prüfen Sie auch, ob der Shop auf HTTPS läuft.

Das PWA-Installations-Banner erscheint nicht. Chrome löst das Ereignis beforeinstallprompt nur aus, wenn die Website installierbar ist, was die in der Konfiguration gesetzten Icons 192 px und 512 px und einen aktiven Service Worker erfordert. Keine Icons, kein Banner.

Das Benachrichtigungs-Banner erscheint nicht. Prüfen Sie, ob die VAPID-Schlüssel generiert sind, ob Web Push aktiviert ist und ob der Benutzer Benachrichtigungen nicht bereits abgelehnt hat. Die Konsole zeigt den genauen Grund.

Was geschieht bei der Deinstallation? Mit der Option zur Datenlöschung werden die Tabellen df_push_subscription und df_push_campaign entfernt. Ohne diese Option bleiben sie erhalten, um Ihre Abonnenten und den Kampagnenverlauf zu bewahren.

War diese Seite hilfreich?

Immer noch nicht weiter? Support kontaktieren