cum să trimiteți notificări Push web cu PHP

logo PHP

API-ul Push Web vă permite să trimiteți notificări push browserelor web și API-urilor. În timp ce cea mai mare parte a logicii se întâmplă în browser, aveți nevoie în continuare de o componentă din partea serverului pentru a vă genera notificările. Iată cum să implementați un backend Push web folosind PHP.

cerințe preliminare

în scopul acestui tutorial, vom presupune că sunteți familiarizați cu elementele de bază ale creării API-urilor HTTP în PHP. Va trebui să expuneți câteva puncte finale publice folosind cadrul dvs. web. Acestea vor fi apelate de JavaScript-ul dvs. din browser pentru a înregistra și anula înregistrarea dispozitivelor.

acest articol nu va atinge codul din partea browserului sau modul în care funcționează. Va trebui să creați un lucrător de service care să răspundă la evenimentele push primite și să afișeze o notificare către utilizator.

la un nivel înalt, fluxul de împingere Web arată astfel:

  1. un abonament push este înregistrat în browser. Browserul emite o adresă URL unică pentru JavaScript.
  2. JavaScript trimite datele abonamentului către serverul dvs. și identifică utilizatorul căruia i se aplică.
  3. când backend-ul dvs. trebuie să trimită o notificare push, creați o sarcină utilă și trimiteți-o la adresa URL a punctului final raportată ca parte a datelor abonamentului.
  4. browserul utilizatorului va primi sarcina utilă prin intermediul platformei de livrare a notificărilor furnizorului. Lucrătorul dvs. de servicii JavaScript gestionează evenimentul în consecință și utilizează API-ul de notificare al browserului pentru a alerta utilizatorul.

Iată cum să implementați aspectele server-side ale pașilor de la 1 la 3.

Noțiuni de bază de configurare

vom folosi web-push packagist pachetul de minishlink. Aceasta abstractizează interacțiunile cu fiecare platformă de notificare a browserului, astfel încât să nu trebuie să faceți distincția manuală între tipurile de puncte finale.

adăugați pachetul la proiectul dvs. folosind Composer:

composer require minishlink/web-push
publicitate

pentru a utiliza cea mai recentă versiune, aveți nevoie de PHP 7.2 sau mai mare cu gmp, mbstring, curl, și openssl extensii. Dacă trebuie să utilizați o versiune PHP mai veche, blocați pachetul la o versiune anterioară pentru a menține compatibilitatea.

biblioteca expune o clasă de bază WebPush cu metode care vă permit să trimiteți notificări individual sau ca loturi. Abonamentele sunt reprezentate de instanțe ale clasei Subscription.

furnizarea cheilor VAPID

încrederea în ecosistemul de împingere web conform standardelor este impusă prin utilizarea cheilor VAPID. Serverul dvs. are nevoie de o pereche de chei VAPIDE, astfel încât să se poată autentifica în browsere. Cheia publică trebuie expusă printr-un punct final API.

puteți genera un set de chei VAPID utilizând pachetul web-push :

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));

generați chei pentru sistemul dvs. și stocați-le într-o locație persistentă. Adăugați un punct final API, astfel încât JavaScript-ul dvs. din partea clientului să poată prelua cheia publică. Aceasta va fi utilizată pentru a configura abonamentul push al browserului. Dispozitivul utilizatorului va accepta evenimentele push primite dacă au fost semnate folosind cheia privată VAPID corespunzătoare.

înregistrarea abonamentelor Push

următorul pas din secvență este primirea cererilor de abonament push de la clienții dvs. Odată ce browserul a confirmat un nou abonament push, JavaScript-ul dvs. ar trebui să trimită URL-ul final al abonamentului și cheile de autentificare asociate serverului dvs. Stocați aceste detalii alături de ID-ul utilizatorului, astfel încât să puteți prelua mai târziu toate dispozitivele înscrise prin împingere legate de utilizator.

publicitate

omitem mostre de cod pentru acest pas, deoarece implementarea depinde de stratul de stocare a datelor și de valorile pe care JavaScript le trimite. De obicei, aceasta va fi o reprezentare JSON a unui obiect PushSubscription. Aveți nevoie de un set simplu de puncte finale API brute susținute de baze de date pentru a crea un abonament, a înlocui unul existent și a solicita o ștergere atunci când utilizatorul se dezabonează.

pregătirea abonamentelor

după înregistrarea cu succes a unui client, puteți începe să trimiteți notificări utilizând biblioteca web-push. Începeți prin crearea unei instanțe a clasei WebPush :

use Minishlink\WebPush\WebPush; $webPush = new WebPush(]);

puteți reutiliza o instanță WebPush de fiecare dată când trimiteți o notificare. Biblioteca trebuie să fie configurată cu setul de chei VAPID pe care l-ați generat mai devreme. Cheile ar trebui să fie codificate ca Base64, dar acest lucru este manipulat pentru tine, dacă le creați cu Biblioteca.

VAPID subject este folosit pentru a identifica serverul și datele sale de contact. Puteți furniza o adresă URL a site-ului web sau un link de adresă de e-mail mailto:.

în continuare trebuie să preluați abonamentul push La care veți trimite. Utilizați sistemul de acces la date pentru a căuta adresele URL push endpoint asociate cu utilizatorul către care doriți să trimiteți. Convertiți fiecare abonament într-o instanță Subscription :

use Minishlink\WebPush\Subscription; // Get user's push data...// SELECT * FROM push_subscriptions WHERE user_id = 123456 $subscription = Subscription::create(]);
publicitate

auth proprietatea PushSubscription se repetă de două ori pentru a face față cu două versiuni diferite ale spec utilizate de serviciile de browser. Proprietatea P256DH este o altă cheie publică care ar trebui furnizată atunci când este setată pe abonament.

biblioteca web-push este compatibilă cu punctele finale push Chrome și Firefox. De asemenea, va funcționa cu orice altă implementare Web Push care îndeplinește standardul actual.

trimiterea unei notificări

acum combinați instanțele WebPush și Subscription pentru a trimite o notificare:

$result = $webPush -> sendOneNotification( $subscription, json_encode());

apelarea sendOneNotification() oferă livrare imediată pentru o singură notificare. Sarcina utilă în acest caz este o matrice codificată JSON cu două proprietăți. Depinde de dvs. ce date trimiteți și formatul pe care îl utilizați – clientul dvs. JavaScript îl primește așa cum este și îl poate interpreta după cum este necesar.

trimiterea unei notificări returnează o clasă de rezultate care vă permite să verificați dacă operațiunea a reușit:

if ($result -> isSuccess()) { // all good}else { // something went wrong error_log($result -> getReason()); // provides raw HTTP response data error_log($result -> getResponse()); }

puteți lua măsuri pentru a încerca din nou sau a anula livrarea dacă apare o eroare.

publicitate

abonamentele de notificare pot expira, de asemenea. Apelați metoda isSubscriptionExpired() pe o clasă de rezultate pentru a determina dacă acesta este motivul eșecului. Puteți șterge abonamentul din Baza de date în acest scenariu, asigurându-vă că nu trimiteți nimic altceva la un punct mort.

notificări de dozare

Notificările pot fi dozate împreună pentru livrare cu un apel de metodă:

$webPush -> queueNotification($subscription, );$webPush -> queueNotification($subscription, ); foreach ($webPush -> flush() as $i => $result) { echo ("Notification $i was " . ($result -> isSuccess() ? "sent" : "not sent"));}

acest lucru este util atunci când știți că veți trimite un număr mare de notificări într-un interval de timp scurt. Coadă toate sarcinile utile și lăsați web-push le livreze în mod optim.

puteți limita numărul de notificări trimise într-un singur flush() trecând un număr întreg la metodă:

$webPush -> flush(100); // send 100 messages

valoarea implicită este 1000.

Opțiuni de notificare

sendOneNotification() și queueNotification() acceptă următoarele opțiuni ca al treilea argument de matrice:

  • TTL – controlează cât timp platforma de notificare a browserului va ține Notificarea dacă nu poate fi transmisă imediat dispozitivului utilizatorului. Dacă dispozitivul utilizatorului este offline, platformele implicit încearcă să-l livreze pentru următoarele patru săptămâni. Dacă trimiteți o notificare care nu va fi relevantă săptămâna viitoare, ajustați TTL în consecință, astfel încât utilizatorul să nu vadă conținut învechit.
  • urgency – acceptă normal, low sau very-low ca valori. Unele platforme pot utiliza acest lucru pentru a ajusta frecvența de livrare a notificărilor. Dispozitivele care intră într-un mod de economisire a bateriei pot suspenda livrarea notificărilor care nu sunt urgente.
  • batchSize – acest lucru are același efect ca argumentul pentru flush() descris mai sus.

puteți configura valorile implicite ale opțiunilor utilizând al doilea argument pentru constructorul WebPush :

$webPush = new WebPush(], );

rezumat

biblioteca web-push facilitează trimiterea notificărilor Push web folosind PHP. Obțineți un strat de abstractizare deasupra diferitelor platforme de browser care acceptă dozarea, gestionarea erorilor și toate funcțiile de împingere Web.

publicitate

mecanismul de împingere Web este un sistem de browser neobișnuit, deoarece se bazează pe componentele de la distanță ale serverului pe care le furnizați. Acest lucru îl poate face să pară opac și tehnic. În practică, crearea unui backend PHP simplu este rapidă și ușoară; implementarea frontendului este de obicei aspectul care consumă mai mult timp, mai ales dacă nu utilizați deja funcțiile service worker.

Leave a Reply