Web Push API umożliwia wysyłanie powiadomień push do przeglądarek internetowych i interfejsów API. Podczas gdy większość logiki odbywa się w przeglądarce, nadal potrzebujesz komponentu po stronie serwera, aby wygenerować powiadomienia. Oto jak zaimplementować web push backend za pomocą PHP.
Streszczenie
warunki wstępne
na potrzeby tego kursu Zakładamy, że znasz podstawy budowania HTTP API w PHP. Będziesz musiał ujawnić kilka publicznych punktów końcowych za pomocą infrastruktury sieciowej. Będą one wywoływane przez JavaScript przeglądarki w celu rejestracji i wyrejestrowania urządzeń.
ten artykuł nie będzie obejmował kodu po stronie przeglądarki ani sposobu jej działania. Będziesz musiał skonfigurować Service worker, który reaguje na przychodzące zdarzenia push i wyświetla powiadomienie dla użytkownika.
na wysokim poziomie web push flow wygląda tak:
- subskrypcja push jest zapisywana w przeglądarce. Przeglądarka wysyła unikalny adres URL punktu końcowego do JavaScript.
- Twój JavaScript wysyła dane subskrypcji do twojego serwera i identyfikuje użytkownika, którego dotyczy.
- gdy twój backend musi wysłać powiadomienie push, Utwórz ładunek i wyślij go do adresu URL punktu końcowego zgłoszonego jako część danych subskrypcji.
- przeglądarka użytkownika otrzyma ładunek za pośrednictwem platformy dostarczania powiadomień dostawcy. Pracownik obsługi JavaScript obsługuje wynikowe Zdarzenie i używa interfejsu API powiadomień przeglądarki do ostrzegania użytkownika.
oto jak zaimplementować aspekty po stronie serwera w krokach od 1 do 3.
Pobierz konfigurację
użyjemy pakietu web-push
packagiste przez minishlink. Nie uwzględnia to interakcji z każdą platformą powiadomień przeglądarki, dzięki czemu nie trzeba ręcznie rozróżniać typów punktów końcowych.
Dodaj pakiet do swojego projektu za pomocą Composera:
composer require minishlink / web-push
aby korzystać z najnowszej wersji potrzebujesz PHP 7.2 lub nowszego z gmp
, mbstring
, curl
, i openssl
rozszerzenia. Jeśli musisz używać starszej wersji PHP, Zablokuj pakiet do starszej wersji, aby zachować zgodność.
biblioteka udostępnia klasę jądra WebPush
z metodami pozwalającymi na wysyłanie powiadomień pojedynczo lub partiami. Subskrypcje są reprezentowane przez instancje klasyfikacji Subscription
.
Zapewnij klucze VAPID
wykorzystanie kluczy vapid zwiększa zaufanie do zgodnego ze standardami ekosystemu web push. Twój serwer potrzebuje pary kluczy VAPID, aby móc uwierzytelniać się za pomocą przeglądarek. Klucz publiczny musi zostać ujawniony za pośrednictwem punktu końcowego API.
możesz wygenerować VAPID brelok używając zawijania web-push
:
use MinishlinkWebPushVAPID; $ keyset = VAPID::createVapidKeys(); // public key - this needs to be accessible via an API endpointthrew out $ keyset; // private key - never expose this!threw out $ keyset; File_put_contents("vapid.json", json_encode($ keyset));
Generuj klucze dla systemu i przechowuj je w stałej lokalizacji. Dodaj punkt końcowy API, aby JavaScript po stronie klienta mógł odzyskać klucz publiczny. Zostanie to wykorzystane do skonfigurowania subskrypcji push przeglądarki. Urządzenie użytkownika będzie akceptować przychodzące zdarzenia push, jeśli zostały one podpisane przy użyciu odpowiedniego klucza prywatnego VAPID.
Rejestracja subskrypcji push
następnym krokiem w kolejności jest otrzymywanie żądań subskrypcji push od klientów. Po potwierdzeniu przez przeglądarkę nowej subskrypcji push skrypt JavaScript powinien wysłać adres URL punktu końcowego subskrypcji i powiązanych kluczy uwierzytelniania do serwera. Przechowuj te dane z identyfikatorem użytkownika, aby później można było pobrać wszystkie zarejestrowane urządzenia push połączone z użytkownikiem.
pomijamy próbki kodu dla tego kroku, ponieważ implementacja zależy od warstwy przechowywania danych i wartości wysyłanych przez JavaScript. Zazwyczaj będzie to reprezentacja JSON obiektu PushSubscription
. Potrzebujesz prostego zestawu punktów końcowych CRUD API opartych na bazie danych, aby utworzyć subskrypcję, zastąpić istniejącą subskrypcję i zażądać usunięcia, gdy użytkownik zrezygnuje z subskrypcji.
przygotowanie subskrypcji
po pomyślnej rejestracji klienta możesz rozpocząć wysyłanie powiadomień za pomocą biblioteki web-push
. Zacznij od utworzenia instancji WebPush
, aby sklasyfikować:
use MinishlinkWebPushWebPush; $ webPush = new WebPush(]);
możesz użyć jednej instancji WebPush
za każdym razem, gdy wysyłasz powiadomienie. Biblioteka musi być skonfigurowana z pierścieniem kluczy VAPID, który wygenerowałeś wcześniej. Klucze muszą być zakodowane w Base64, ale jest to obsługiwane dla Ciebie, jeśli tworzysz je z biblioteką.
VAPID subject
służy do identyfikacji serwera i jego danych kontaktowych. Możesz podać adres URL witryny lub link do adresu e-mail mailto:
.
następnie musisz pobrać subskrypcję push, do której zamierzasz wysłać. Użyj systemu dostępu do danych, aby znaleźć adresy URL punktów końcowych push powiązane z użytkownikiem, do którego chcesz wysłać wiadomość. Konwertuj każdą subskrypcję na jeden Subscription
przykład:
use MinishlinkWebPushSubscription; // Get user's push data ...// SELECT * FROM push_subscriptions WHERE user_id = 123456 $ subscription = Subscription::create(]);
właściwość auth
PushSubscription
jest powtarzana dwukrotnie, aby poradzić sobie z dwiema różnymi wersjami specyfikacji używanymi przez usługi przeglądarek. Właściwość P256DH jest kolejnym kluczem publicznym, który musi być dostarczony po ustawieniu w subskrypcji.
web-push
Biblioteka jest kompatybilna z Chrome i Firefox push endpoints. Będzie również współpracować z każdą inną implementacją web push, która spełnia obecny standard.
wysyłanie powiadomienia
teraz Połącz swoje wystąpienia WebPush
i Subscription
, aby wysłać powiadomienie:
$ result = $ webPush -> sendOneNotification( $ subscription, json_encode());
Appel sendOneNotification()
zapewnia natychmiastową dostawę za pojedyncze zgłoszenie. Ładunek w tym przypadku jest tablicą zakodowaną JSON z dwiema właściwościami. To od Ciebie zależy, jakie dane wysyłasz i jakiego formatu używasz – twój Klient JavaScript otrzymuje je w takim stanie, w jakim są i może je zinterpretować w razie potrzeby.
wysłanie powiadomienia zwraca klasę result, która pozwala sprawdzić, czy operacja się powiodła:
if ($ result -> isSuccess()) { // all good}else { // something went wrong error_log($ result -> getReason()); // provides raw HTTP response data error_log($ result -> getResponse()); }
możesz podjąć kroki, aby spróbować ponownie lub anulować dostawę, jeśli wystąpi błąd.
subskrypcje powiadomień mogą również wygasnąć. Wywołanie isSubscriptionExpired()
w klasie result, aby określić, czy jest to przyczyna błędu. W tym scenariuszu możesz usunąć subskrypcję z bazy danych, upewniając się, że nie wysyłasz niczego innego do martwego punktu końcowego.
powiadomienia wsadowe
powiadomienia można grupować, aby były dostarczane za pomocą jednego wywołania metody:
$ webPush -> queueNotification($ subscription, );$ webPush -> queueNotification($ subscription, ); foreach ($ webPush -> flush() as $i => $ result) { threw out ("Notification $i was " . ($ result -> isSuccess() ? "feels" : "not sent"));}
jest to przydatne, gdy wiesz, że masz zamiar wysłać dużą liczbę powiadomień w krótkim czasie. Kolejkuj wszystkie swoje ładunki i pozwól web-push
dostarczyć je optymalnie.
możesz ograniczyć liczbę powiadomień wysyłanych w jednym flush()
przekazując liczbę całkowitą do metody:
$ webPush -> flush(100); // send 100 messages
domyślną wartością jest 1000
.
opcje powiadomień
sendOneNotification()
et queueNotification()
akceptują następujące opcje jako trzeci argument tablicy:
-
TTL
– kontroluje, jak długo Platforma powiadomień przeglądarki będzie przechowywać powiadomienie, jeśli nie może zostać natychmiast dostarczone do urządzenia użytkownika. Jeśli urządzenie użytkownika jest offline, platformy będą starały się dostarczać je domyślnie przez następne cztery tygodnie. Jeśli wyślesz powiadomienie, które nie będzie odpowiednie w przyszłym tygodniu, dostosuj odpowiednio wiek, aby użytkownik nie widział nieaktualnych treści. -
urgency
– Akceptujnormal
,low
ouvery-low
jako wartości. Niektóre platformy mogą go używać do dostosowywania częstotliwości dostarczania powiadomień. Urządzenia, które wchodzą w tryb oszczędzania baterii może zawiesić dostarczanie powiadomień nie pilne. -
batchSize
– ma to taki sam efekt jak argument zflush()
opisany powyżej.
możesz skonfigurować domyślne wartości opcji, używając drugiego argumentu producenta WebPush
:
$ webPush = new WebPush(], );
podsumowanie
web-push
biblioteka ułatwia wysyłanie powiadomień web push za pomocą PHP. Otrzymujesz warstwę abstrakcji na różnych platformach przeglądarek, która obsługuje przetwarzanie wsadowe, obsługę błędów i wszystkie funkcje web push.
mechanizm web push jest nietypowym systemem przeglądarek, ponieważ opiera się na zdalnych komponentach po stronie serwera, które sam dostarczasz. Może to sprawiać wrażenie nieprzezroczystego i technicznego. W praktyce tworzenie prostego zaplecza PHP jest szybkie i łatwe; implementacja front-end jest zwykle najbardziej czasochłonnym aspektem, zwłaszcza jeśli nie korzystasz jeszcze z funkcji service worker.