jak posílat oznámení Web Push s PHP
Web Push API umožňuje odesílat oznámení push webovým prohlížečům a API. Zatímco většina logiky se děje v prohlížeči, stále potřebujete komponentu na straně serveru pro generování oznámení. Zde je návod, jak implementovat webový backend pomocí PHP.
předpoklady
pro účely tohoto tutoriálu předpokládáme, že jste obeznámeni se základy vytváření HTTP API v PHP. Budete muset vystavit několik veřejných koncových bodů pomocí webového rámce. Ty budou volány vaším JavaScriptem v prohlížeči k registraci a odhlášení zařízení.
tento článek se nedotkne kódu na straně prohlížeče ani toho, jak funguje. Budete muset dát dohromady servisního pracovníka, který reaguje na příchozí události push a zobrazí upozornění uživateli.
na vysoké úrovni vypadá tok webového tlaku takto:
- v prohlížeči je zaregistrováno předplatné push. Prohlížeč vydá do vašeho JavaScriptu jedinečnou adresu URL koncového bodu.
- váš JavaScript odešle data předplatného na váš server a identifikuje uživatele, na kterého se vztahuje.
- když váš backend potřebuje odeslat oznámení push, vytvořte užitečné zatížení a odešlete jej na adresu URL koncového bodu nahlášenou jako součást údajů o předplatném.
- prohlížeč uživatele obdrží užitečné zatížení prostřednictvím platformy pro doručování oznámení dodavatele. Váš servisní pracovník JavaScript zpracovává následnou událost a používá API oznámení prohlížeče k upozornění uživatele.
zde je návod, jak implementovat aspekty na straně serveru kroků 1 až 3.
získání nastavení
použijeme web-push
balíček Packagist od minishlink. To abstraktuje interakce s každou platformou oznámení prohlížeče, takže nemusíte ručně rozlišovat mezi typy koncových bodů.
přidejte balíček do projektu pomocí Composeru:
composer require minishlink/web-push
Chcete-li používat nejnovější verzi, potřebujete PHP 7.2 nebo vyšší s gmp
, mbstring
, curl
, a openssl
rozšíření. Pokud musíte použít starší verzi PHP, uzamkněte balíček na starší verzi, aby byla zachována kompatibilita.
knihovna vystavuje třídu core WebPush
metodami, které vám umožňují odesílat oznámení jednotlivě nebo jako dávky. Odběry jsou reprezentovány instancemi třídy Subscription
.
poskytování VAPID klíčů
důvěra v ekosystém webového Push vyhovující standardům je vynucena použitím VAPID klíčů. Váš server potřebuje pár VAPID klíčů, aby se mohl autentizovat do prohlížečů. Veřejný klíč by měl být vystaven prostřednictvím koncového bodu API.
pomocí balíčku web-push
můžete vygenerovat VAPID key set:
use Minishlink\WebPush\VAPID; $keyset = VAPID::createVapidKeys(); // public key - this needs to be accessible via an API endpointecho $keyset; // private key - never expose this!echo $keyset; file_put_contents("vapid.json", json_encode($keyset));
Vygenerujte klíče pro váš systém a uložte je na trvalé místo. Přidejte koncový bod API, aby váš JavaScript na straně klienta mohl načíst veřejný klíč. To bude použito k nastavení předplatného push prohlížeče. Zařízení uživatele bude přijímat příchozí push události, pokud byly podepsány pomocí odpovídajícího VAPID soukromého klíče.
registrace předplatného Push
dalším krokem v pořadí je přijímání žádostí o předplatné push od vašich klientů. Jakmile prohlížeč potvrdí nové předplatné push, váš JavaScript by měl odeslat adresu URL koncového bodu předplatného a související ověřovací klíče na váš server. Uložte tyto údaje vedle ID uživatele, abyste mohli později načíst všechna zařízení zapsaná na push.
pro tento krok vynecháváme ukázky kódu, protože implementace závisí na vrstvě úložiště dat a hodnotách, které váš JavaScript odešle. Obvykle se jedná o JSON reprezentaci objektu PushSubscription
. K vytvoření předplatného potřebujete jednoduchou sadu koncových bodů CRUD API podporovaných databází, nahradit stávající, a požádat o odstranění, když se uživatel odhlásí.
Příprava předplatného
jakmile je klient úspěšně zaregistrován, můžete začít odesílat oznámení pomocí knihovny web-push
. Začněte vytvořením instance třídy WebPush
:
use Minishlink\WebPush\WebPush; $webPush = new WebPush(]);
při každém odeslání oznámení můžete znovu použít jednu instanci WebPush
. Knihovnu je třeba nakonfigurovat pomocí sady klíčů VAPID, kterou jste vygenerovali dříve. Klíče by měly být kódovány jako Base64, ale to je zpracováno pro vás, pokud je vytvoříte s knihovnou.
VAPID subject
se používá k identifikaci vašeho serveru a jeho kontaktních údajů. Můžete zadat adresu URL webu nebo odkaz na e-mailovou adresu mailto:
.
Dále musíte načíst předplatné push, které budete odesílat. Pomocí systému pro přístup k datům vyhledejte adresy URL koncového bodu push přidružené k uživateli, kterému chcete odeslat. Převést každé předplatné na instanci Subscription
:
use Minishlink\WebPush\Subscription; // Get user's push data...// SELECT * FROM push_subscriptions WHERE user_id = 123456 $subscription = Subscription::create(]);
vlastnost auth
PushSubscription
se opakuje dvakrát, aby se vyrovnala se dvěma různými verzemi specifikací používaných službami prohlížeče. Vlastnost P256DH je dalším veřejným klíčem, který by měl být dodán při nastavení předplatného.
knihovna web-push
je kompatibilní s koncovými body Chrome a Firefox push. Bude také pracovat s jakoukoli jinou implementací Web Push, která splňuje současný standard.
odeslání oznámení
nyní Zkombinujte své instance WebPush
a Subscription
a odešlete oznámení:
$result = $webPush -> sendOneNotification( $subscription, json_encode());
volání sendOneNotification()
poskytuje okamžité doručení pro jedno oznámení. Užitečné zatížení je v tomto případě pole kódované JSON se dvěma vlastnostmi. Je jen na vás, jaká data odešlete a jaký formát použijete – váš klient JavaScript je obdrží tak, jak je, a může je interpretovat podle potřeby.
odeslání oznámení vrátí třídu výsledků, která vám umožní zkontrolovat, zda byla operace úspěšná:
if ($result -> isSuccess()) { // all good}else { // something went wrong error_log($result -> getReason()); // provides raw HTTP response data error_log($result -> getResponse()); }
můžete podniknout kroky k opakování nebo zrušení dodávky, pokud dojde k chybě.
předplatné oznámení může také vypršet. Zavolejte metodu isSubscriptionExpired()
na třídu výsledků a zjistěte, zda je to důvod selhání. V tomto scénáři můžete odstranit předplatné z databáze a zajistit, že do mrtvého koncového bodu neposíláte nic jiného.
dávkovací oznámení
oznámení lze dávkovat společně pro doručení jedním způsobem volání:
$webPush -> queueNotification($subscription, );$webPush -> queueNotification($subscription, ); foreach ($webPush -> flush() as $i => $result) { echo ("Notification $i was " . ($result -> isSuccess() ? "sent" : "not sent"));}
to je užitečné, když víte, že budete posílat velké množství oznámení v krátkém časovém rámci. Zařaďte všechna užitečná zatížení do fronty a nechte web-push
je doručit optimálním způsobem.
počet oznámení odeslaných v jediném flush()
můžete omezit předáním celého čísla metodě:
$webPush -> flush(100); // send 100 messages
výchozí hodnota je 1000
.
možnosti oznámení
sendOneNotification()
a queueNotification()
akceptují následující možnosti jako argument třetího pole:
-
TTL
– určuje, jak dlouho bude platforma oznámení prohlížeče držet oznámení, pokud jej nelze okamžitě předat zařízení uživatele. Pokud je zařízení uživatele offline, platformy se jej pokusí doručit na další čtyři týdny. Pokud posíláte oznámení, které nebude příští týden relevantní, upravte TTL odpovídajícím způsobem, aby uživatel neviděl zastaralý obsah. -
urgency
– přijímánormal
,low
nebovery-low
jako hodnoty. Některé platformy to mohou použít k úpravě frekvence doručování oznámení. Zařízení, která vstupují do režimu úspory baterie, mohou pozastavit doručování naléhavých oznámení. -
batchSize
– to má stejný účinek jako argumentflush()
popsaný výše.
výchozí hodnoty voleb můžete nakonfigurovat pomocí druhého argumentu konstruktoru WebPush
:
$webPush = new WebPush(], );
shrnutí
knihovna web-push
usnadňuje odesílání oznámení Web Push pomocí PHP. Na různých platformách prohlížečů získáte vrstvu abstrakce, která podporuje dávkování, zpracování chyb a všechny funkce webového Push.
webový Push mechanismus je neobvyklý prohlížečový systém, protože je závislý na vzdálených součástech na straně serveru, které sami dodáváte. To může vypadat neprůhledně a technicky. V praxi je vytvoření jednoduchého PHP backendu rychlé a snadné; implementace frontendu je obvykle časově náročnější aspekt, zejména pokud ještě nepoužíváte funkce servisního pracovníka.
Leave a Reply