Web Push API umožňuje posílat oznámení push do webových prohlížečů a API. Zatímco většina logiky probíhá v prohlížeči, pro generování oznámení stále potřebujete komponentu na straně serveru. Zde je návod, jak implementovat webový backend pomocí PHP.
shrnutí
předpoklady
pro účely tohoto tutoriálu předpokládáme, že znáte základy vytváření HTTP API v PHP. Budete muset vystavit několik veřejných koncových bodů pomocí webové infrastruktury. Ty budou vyvolány JavaScriptem vašeho prohlížeče k registraci a odhlášení zařízení.
tento článek se nebude týkat kódu na straně prohlížeče ani toho, jak funguje. Budete muset nastavit 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:
- předplatné push se uloží do prohlížeče. Prohlížeč odešle do vašeho JavaScriptu jedinečnou adresu URL koncového bodu.
- váš JavaScript odesílá 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í poskytovatele. Váš servisní pracovník JavaScript zpracovává vý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ískat konfiguraci
použijeme balíček web-push
Packagiste od minishlink. To nebere v úvahu interakce s každou platformou oznámení prohlížeče, takže nemusíte ručně rozlišovat 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 jádra WebPush
metodami, které umožňují odesílat oznámení jednotlivě nebo v dávkách. Odběry jsou reprezentovány instancemi klasifikace Subscription
.
Poskytněte VAPID klíče
důvěra v webový push ekosystém vyhovující standardům je zvýšena použitím VAPID klíčů. Váš server potřebuje pár VAPID klíčů, aby bylo možné ověřit pomocí prohlížečů. Veřejný klíč musí být vystaven prostřednictvím koncového bodu API.
můžete vytvořit VAPID klíčenka pomocí web-push
zábal:
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));
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 ke konfiguraci 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 zákazníků. Poté, co prohlížeč potvrdí nové předplatné push, váš JavaScript by měl odeslat adresu URL koncového bodu předplatného a přidružených autentizačních klíčů na váš server. Uložte tyto údaje pomocí ID uživatele, abyste mohli později načíst všechna zařízení zapsaná push propojená s uživatelem.
pro tento krok vynecháme ukázky kódu, protože implementace závisí na vrstvě úložiště dat a hodnotách odeslaných vaším JavaScriptem. Obvykle se jedná o JSON reprezentaci objektu PushSubscription
. K vytvoření předplatného potřebujete jednoduchou sadu koncových bodů CRUD API založených na databázi, nahradit stávající předplatné, a požádat o smazání, když se uživatel odhlásí.
Příprava předplatného
jakmile je zákazník úspěšně zaregistrován, můžete začít odesílat oznámení pomocí knihovny web-push
. Začněte vytvořením instance WebPush
pro klasifikaci:
use MinishlinkWebPushWebPush; $ webPush = new WebPush(]);
při každém odeslání oznámení můžete znovu použít jednu instanci WebPush
. Knihovna musí být nakonfigurován s VAPID kroužek na klíče, které jste vygenerovali dříve. Klíče musí být zakódovány Base64, ale to je zpracováno pro vás, pokud je vytvoříte s knihovnou.
VAPID subject
slouží k identifikaci vašeho serveru a jeho kontaktních údajů. Můžete zadat adresu URL webu nebo odkaz na e-mailovou adresu mailto:
.
pak musíte chytit předplatné push, které chcete odeslat. Pomocí systému pro přístup k datům vyhledejte adresy URL koncových bodů push přidružené k uživateli, kterému chcete odeslat. Převést každé předplatné na jeden příklad Subscription
:
use MinishlinkWebPushSubscription; // 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 vypořádala se dvěma různými verzemi SPECIFIKACE používané službami prohlížeče. Vlastnost P256DH je další veřejný klíč, který musí být poskytnut při nastavení předplatného.
web-push
knihovna 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
et Subscription
a odešlete oznámení:
$ result = $ webPush -> sendOneNotification( $ subscription, json_encode());
Appel sendOneNotification()
poskytuje okamžité doručení pro jedno oznámení. Užitečné zatížení je v tomto případě JSON kódované pole 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()); }
pokud dojde k chybě, můžete provést kroky k opakování nebo zrušení doručení.
předplatné oznámení může také vypršet. Zavolejte isSubscriptionExpired()
na třídu výsledků a zjistěte, zda je to důvod selhání. V tomto scénáři můžete předplatné odebrat z databáze a ujistěte se, že do mrtvého koncového bodu neposíláte nic jiného.
dávková oznámení
oznámení lze seskupit tak, aby byla doručena jediným způsobem volání:
$ webPush -> queueNotification($ subscription, );$ webPush -> queueNotification($ subscription, ); foreach ($ webPush -> flush() as $i => $ result) { threw out ("Notification $i was " . ($ result -> isSuccess() ? "feels" : "not sent"));}
to je užitečné, když víte, že v krátké době odešlete velké množství oznámení. Zařaďte všechna užitečná zatížení do fronty a nechte je optimálně doručit web-push
.
můžete omezit počet oznámení odeslaných v jednom flush()
předáním celého čísla metodě:
$ webPush -> flush(100); // send 100 messages
výchozí hodnota je 1000
.
možnosti oznámení
sendOneNotification()
et queueNotification()
přijmout následující volby jako třetí argument pole:
-
TTL
– určuje, jak dlouho bude platforma oznámení prohlížeče uchovávat oznámení, pokud jej nelze okamžitě doručit do zařízení uživatele. Pokud je zařízení uživatele offline, platformy se jej ve výchozím nastavení pokusí doručit na další čtyři týdny. Pokud odešlete oznámení, které nebude relevantní příští týden, upravte podle toho věk, aby uživatel neviděl zastaralý obsah. -
urgency
– přijmoutnormal
,low
ouvery-low
jako hodnoty. Některé platformy jej 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 argument zflush()
popsaný výše.
výchozí hodnoty voleb můžete nakonfigurovat pomocí druhého argumentu výrobce WebPush
:
$ webPush = new WebPush(], );
shrnutí
web-push
knihovna 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é zpracování,zpracování chyb a všechny funkce web push.
webový push mechanismus je neobvyklý systém prohlížeče, protože se spoléhá na vzdálené komponenty na straně serveru, které sami poskytnete. Díky tomu může vypadat neprůhledně a technicky. V praxi je vytvoření jednoduchého PHP backendu rychlé a snadné; implementace front-end je obvykle časově nejnáročnějším aspektem, zejména pokud již nepoužíváte funkce servisního pracovníka.