# DfPwaPush: kompletny przewodnik

> DfPwaPush łączy dwie funkcje w jednym pluginie Shopware: zamienia Twój storefront w instalowalną Progressive Web App (manifest, service worker, strona offline, baner instalacji) i pozwala ponownie angażować klientów powiadomieniami Web…

- Strona: <https://www.datafirefly.com/pl/documentation/dfpwapush/>
- Język: pl
- Zaktualizowano: 2026-07-29
- Inne języki: [fr](https://www.datafirefly.com/documentation/dfpwapush/index.md), [en](https://www.datafirefly.com/en/documentation/dfpwapush/index.md), [es](https://www.datafirefly.com/es/documentation/dfpwapush/index.md), [de](https://www.datafirefly.com/de/documentation/dfpwapush/index.md), [it](https://www.datafirefly.com/it/documentation/dfpwapush/index.md), [nl](https://www.datafirefly.com/nl/documentation/dfpwapush/index.md), [pt](https://www.datafirefly.com/pt/documentation/dfpwapush/index.md)
- Indeks: <https://www.datafirefly.com/pl/documentation/llms.txt>

DfPwaPush łączy dwie funkcje w jednym pluginie Shopware: zamienia Twój storefront w **instalowalną Progressive Web App** (manifest, service worker, strona offline, baner instalacji) i pozwala ponownie angażować klientów **powiadomieniami Web Push** w pełni hostowanymi u Ciebie. Żadnej usługi zewnętrznej (ani Firebase, ani OneSignal), żadnej zależności Composera: szyfrowanie Web Push (RFC 8291) i podpis VAPID (RFC 8292) są zaimplementowane natywnie z użyciem rozszerzeń OpenSSL i cURL wymaganych już przez Shopware. Wszystkie dane subskrypcji pozostają na Twoim serwerze. Ten przewodnik obejmuje instalację, konfigurację PWA i Push, generowanie kluczy VAPID, tworzenie i wysyłkę kampanii, wykonywanie w tle oraz rozwiązywanie problemów.

## Instalacja

1. Pobierz archiwum `DfPwaPush-1.0.2.zip` ze swojego konta DataFirefly.
2. Zainstaluj je przez **Administracja → Rozszerzenia → Moje rozszerzenia → Prześlij rozszerzenie** albo skopiuj rozpakowany katalog `DfPwaPush` do `custom/plugins/`.
3. Uruchom instalację i aktywację: ``` bin/console plugin:refresh bin/console plugin:install --activate DfPwaPush bin/console cache:clear ```
4. Przy instalacji plugin tworzy swoje dwie tabele (`df_push_subscription` i `df_push_campaign`) i rejestruje swój ScheduledTask wysyłki.

Zgodny z Shopware 6.5.x, 6.6.x i 6.7.x na jednym codebase. Moduł administracji jest dostarczany **prekompilowany**, a JavaScript storefrontu jest wstrzykiwany przez Twig: **żaden build nie jest potrzebny**, ani `build-administration.sh`, ani build storefrontu. Wymagane rozszerzenia PHP: `openssl` i `curl`, oba wymagane już przez Shopware. Żadnych dodatkowych zależności Composera.

## Wymóg HTTPS

Service workery i API Web Push istnieją wyłącznie na bezpiecznym origin. Twój sklep **musi** być serwowany po HTTPS (wyjątkiem w developmencie jest tylko `localhost`). W sklepie na HTTP plugin pozostaje cichy po stronie frontu i loguje to w konsoli przeglądarki.

## Gdzie znaleźć plugin w administracji

Po aktywacji w menu **Marketing** administracji pojawia się pozycja **Kampanie push**. To tam tworzysz, planujesz i śledzisz swoje kampanie. Cała konfiguracja PWA i Push odbywa się w konfiguracji pluginu, per kanał sprzedaży, przez **Rozszerzenia → Moje rozszerzenia → DfPwaPush → ⋯ → Konfiguruj**.

Jeśli pozycja menu nie pojawia się po aktualizacji, wykonaj `bin/console assets:install && bin/console cache:clear`, a następnie przeładuj administrację z wymuszonym odświeżeniem (Ctrl+Shift+R).

## Generowanie kluczy VAPID

Web Push opiera się na parze kluczy VAPID (norma RFC 8292), która uwierzytelnia Twój serwer wobec usług push przeglądarek. Wygenerujesz je jedną komendą:

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

Klucze są zapisywane bezpośrednio w konfiguracji pluginu. Użyj opcji `--force`, aby je wygenerować ponownie. Możesz też wkleić istniejące klucze VAPID w pola konfiguracji.

Ponowne wygenerowanie kluczy VAPID **unieważnia wszystkie istniejące subskrypcje**: już zapisane przeglądarki nie będą mogły odbierać powiadomień i będą musiały zapisać się ponownie. Rób to wyłącznie świadomie.

## Konfiguracja PWA

Karta **PWA** w konfiguracji (ustawiana per kanał sprzedaży) steruje instalowalnością Twojego sklepu:

- **Włącz PWA**: serwuje manifest i service worker.
- **Nazwa i skrócona nazwa aplikacji**: wyświetlane na ekranie głównym po instalacji.
- **Kolor motywu / kolor tła**: domyślnie `#0f172a` dla motywu.
- **Tryb wyświetlania**: `standalone`, `minimal-ui`, `fullscreen` albo `browser`.
- **Ikony 192 px i 512 px**: pliki PNG do wgrania, **niezbędne** dla instalowalności.
- **Baner instalacji**: włącza monit "Dodaj do ekranu głównego".

Bez uzupełnionych obu ikon 192 px i 512 px Chrome nie uznaje witryny za instalowalną i baner instalacji nigdy się nie wyświetli. To przyczyna numer jeden zgłoszeń, że PWA "nic nie robi" po stronie frontu.

## Konfiguracja Push

Karta **Push** steruje powiadomieniami:

- **Włącz Web Push**: aktywuje baner opt-in i endpointy subskrypcji. Domyślnie włączone.
- **Klucz publiczny / klucz prywatny VAPID**: generowane powyższą komendą.
- **Temat VAPID**: adres `mailto:` albo adres URL Twojej witryny.
- **Opóźnienie opt-in**: liczba sekund przed pojawieniem się banera zgody (domyślnie 8).

## Service worker i endpointy storefrontu

Wszystkie zasoby PWA są serwowane dynamicznie przez kontroler, co uodparnia je na przejście z webpacka na Vite w 6.7:

- `GET /df-pwa/manifest.json`: manifest PWA, generowany per kanał sprzedaży.
- `GET /df-pwa/sw.js`: service worker (nagłówek `Service-Worker-Allowed: /` do kontrolowania całego origin).
- `GET /df-pwa/icon/{192|512}`: ikony PWA.
- `GET /df-pwa/offline`: zapasowa strona offline, cache'owana przez service worker.
- `POST /df-pwa/subscribe` i `POST /df-pwa/unsubscribe`: rejestracja i usunięcie subskrypcji (XHR).

Service worker cache'uje stronę offline przy instalacji, serwuje zastępczą treść dla nieudanych nawigacji i wyświetla otrzymane powiadomienia przez zdarzenie `push`, z przekierowaniem po kliknięciu na adres URL kampanii.

## Tworzenie i wysyłka kampanii

1. Przejdź do **Marketing → Kampanie push → Utwórz kampanię**.
2. Uzupełnij tytuł, treść i ewentualnie docelowy adres URL oraz ikonę.
3. W razie potrzeby ogranicz kampanię do kanału sprzedaży (inaczej celem są wszyscy subskrybenci).
4. Albo ustaw **datę zaplanowania** i zapisz, albo kliknij **Wyślij teraz**.

"Wyślij teraz" umieszcza kampanię w kolejce natychmiastowej (status `scheduled` z datą wysyłki na bieżącą chwilę); zadanie cykliczne przejmuje ją w ciągu kolejnych minut. Kampania przechodzi przez statusy `draft` → `scheduled` → `sending` → `sent` (albo `failed`), a karta pokazuje liczniki udanych wysyłek i błędów.

## Wysyłka w tle: ScheduledTask i CLI

Wysyłkę kampanii zapewnia ScheduledTask `df_pwa_push.send_campaigns`, wykonywany co 300 sekund. Pobiera zaplanowane kampanie, których termin nadszedł, i wysyła je partiami. Wysyłkę możesz też uruchomić ręcznie:

```
bin/console df:pwa-push:send
```

Jak każdy ScheduledTask Shopware, wysyłka zależy od aktywnego workera. Upewnij się, że działa consumer Messengera (`bin/console messenger:consume`) albo że scheduler Shopware jest regularnie wyzwalany, inaczej zaplanowane kampanie nie wyjdą.

## Natywny Web Push, bez zależności

DfPwaPush implementuje pełny stos Web Push w czystym PHP, bez zewnętrznej biblioteki:

- **VAPID / ES256** (RFC 8292): generowanie kluczy P-256 przez OpenSSL i podpis JWT ES256 do uwierzytelnienia serwera.
- **Szyfrowanie aes128gcm** (RFC 8291): efemeryczne ECDH, wyprowadzanie HKDF i szyfrowanie AES-128-GCM wiadomości dla każdego subskrybenta.
- **Wysyłka równoległa** przez `curl_multi` partiami, z obsługą kodów zwrotnych usług push.

Implementacja jest zweryfikowana bajt po bajcie względem oficjalnego wektora testowego RFC 8291, co gwarantuje interoperacyjność z Chrome, Firefoksem, Edge i Safari.

## Automatyczne czyszczenie subskrypcji

Gdy usługa push odpowiada, że subskrypcja już nie istnieje (kody HTTP 404 lub 410), odpowiadająca jej subskrypcja jest automatycznie dezaktywowana. Subskrypcje, które zawodzą wielokrotnie (5 kolejnych błędów), również są dezaktywowane. Twoja baza subskrybentów pozostaje w ten sposób czysta bez żadnej interwencji.

## Zgodność z iOS i Safari

Na iOS Web Push wymaga **iOS 16.4 lub nowszego** _oraz_ zainstalowania PWA na ekranie głównym: Safari nie dostarcza powiadomień push do zwykłej karty. Plugin obsługuje ten przypadek czysto: baner opt-in pojawia się dopiero wtedy, gdy API Push jest rzeczywiście dostępne, więc Twoim odwiedzającym na iOS nie są składane fałszywe obietnice.

## FAQ i rozwiązywanie problemów

**Instalacja z ZIP kończy się błędem "brakuje pakietu minishlink/web-push".** Ten błąd dotyczył wcześniejszych wersji. Od 1.0.1 Web Push jest natywny i plugin nie ma już żadnej zależności Composera: bieżąca wersja instaluje się na dowolnym hostingu, także współdzielonym.

**W panelu nie ma nic do tworzenia kampanii.** Moduł administracji jest prekompilowany od 1.0.1. Po aktualizacji uruchom `bin/console assets:install && bin/console cache:clear` i przeładuj administrację z wymuszonym pominięciem cache (Ctrl+Shift+R). Pozycja znajduje się w **Marketing → Kampanie push**.

**Adres /df-pwa/manifest.json zwraca błąd 500.** Naprawione w 1.0.2: metoda `setTwig()` kontrolera nadrzędnego została usunięta w Shopware 6.7, co powodowało błąd wszystkich tras `/df-pwa/*`. Zaktualizuj do 1.0.2 lub nowszej.

**W storefroncie nic się nie dzieje.** Otwórz konsolę przeglądarki: plugin loguje każdą decyzję z prefiksem `[DfPwaPush]` (service worker zarejestrowany lub nie, brakujący klucz VAPID, odmowa uprawnień, iOS bez zainstalowanej PWA…). Sprawdź też, czy sklep działa po HTTPS.

**Baner instalacji PWA się nie wyświetla.** Chrome emituje zdarzenie `beforeinstallprompt` tylko wtedy, gdy witryna jest instalowalna, co wymaga uzupełnionych w konfiguracji ikon 192 px i 512 px oraz aktywnego service workera. Bez ikon nie ma banera.

**Baner powiadomień się nie wyświetla.** Sprawdź, czy klucze VAPID są wygenerowane, czy Web Push jest włączony i czy użytkownik już wcześniej nie odmówił powiadomień. Konsola pokaże dokładny powód.

**Co dzieje się przy odinstalowaniu?** Z opcją usunięcia danych tabele `df_push_subscription` i `df_push_campaign` są usuwane. Bez tej opcji są zachowywane, aby ocalić Twoich subskrybentów i historię kampanii.
