Cum să trimiteți notificări push web cu 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 are loc î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.

rezumat

precondiții

în scopul acestui tutorial, vom presupune că știți elementele de bază ale construirii API-urilor HTTP în PHP. Va trebui să expuneți câteva puncte finale publice folosind infrastructura dvs. web. Acestea vor fi apelate de JavaScript-ul browserului dvs. pentru a înregistra și anula înregistrarea dispozitivelor.

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

la un nivel ridicat, fluxul de împingere web arată astfel:

  1. un abonament push este salvat în browser. Browserul trimite o adresă URL unică a punctului final către 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 rezultat și utilizează API-ul de notificare a browserului pentru a alerta utilizatorul.

Iată cum să implementați aspectele din partea serverului ale pașilor de la 1 la 3.

get configuration

vom folosi pachetul web-push Packagiste de minishlink. Acest lucru nu ia în considerare interacțiunile cu fiecare platformă de notificare a browserului, astfel încât nu trebuie să distingeți manual tipurile de puncte finale.

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

composer require minishlink / web-push

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 mai veche de PHP, blocați pachetul la o versiune mai veche pentru a menține compatibilitatea.

biblioteca expune o clasă kernel WebPush cu metode care vă permit să trimiteți notificări individual sau în loturi. Abonamentele sunt reprezentate de instanțe ale clasificării Subscription.

furnizați chei VAPID

încrederea în ecosistemul de împingere web compatibil cu standardele este sporită prin utilizarea cheilor VAPID. Serverul dvs. are nevoie de o pereche de chei VAPID pentru a putea autentifica cu browserele. Cheia publică trebuie expusă printr-un punct final API.

puteți genera un inel cheie VAPID folosind web-push wrap:

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

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 în secvență este să primiți cereri de abonament push de la clienții dvs. După ce browserul confirmă un nou abonament push, JavaScript-ul dvs. ar trebui să trimită adresa URL a punctului final al abonamentului și cheile de autentificare asociate către serverul dvs. Stocați aceste detalii cu ID-ul de utilizator, astfel încât să puteți prelua mai târziu orice dispozitive înscrise push legate de utilizator.

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

pregătirea abonamentelor

odată ce un client este înregistrat cu succes, puteți începe să trimiteți notificări utilizând biblioteca web-push. Începeți prin a crea o instanță a WebPush pentru a clasifica:

use MinishlinkWebPushWebPush; $ webPush = new WebPush(]);

puteți reutiliza o instanță WebPush de fiecare dată când trimiteți o notificare. Biblioteca trebuie să fie configurată cu inelul cheie VAPID pe care l-ați generat mai devreme. Tastele trebuie să fie Base64 codificate, 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:.

atunci trebuie să apucați abonamentul push La care veți trimite. Utilizați sistemul de acces la date pentru a găsi adresele URL push endpoint asociate cu utilizatorul către care doriți să trimiteți. Convertiți fiecare abonament într-un exemplu Subscription :

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

proprietatea auth a PushSubscription se repetă de două ori pentru a trata două versiuni diferite ale specificației utilizate de serviciile browserului. Proprietatea P256DH este o altă cheie publică care trebuie furnizată atunci când este setată pe abonament.

web-push Biblioteca 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 et Subscription pentru a trimite o notificare:

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

Appel 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 ce format 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 avut succes:

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 reîncerca sau anula livrarea dacă apare o eroare.

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

notificări lot

Notificările pot fi grupate împreună pentru a fi livrate cu un singur apel metodă:

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

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

puteți limita numărul de notificări trimise într-un flush() care trece un număr întreg la metoda:

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

valoarea implicită este 1000.

Opțiuni de notificare

sendOneNotification() et queueNotification() acceptați următoarele opțiuni ca al treilea argument al matricei:

  • TTL – controlează cât timp platforma de notificare a browserului va păstra Notificarea dacă nu poate fi livrată imediat pe dispozitivul utilizatorului. Dacă dispozitivul utilizatorului este offline, platformele vor încerca să îl livreze în mod implicit 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 vârsta în consecință, astfel încât utilizatorul să nu vadă conținut învechit.
  • urgency – acceptați normal, low ou very-low ca valori. Unele platforme îl pot utiliza pentru a ajusta frecvența de livrare a notificărilor. Dispozitivele care intră în modul de economisire a bateriei pot suspenda livrarea notificărilor care nu sunt urgente.
  • batchSize – acest lucru are același efect ca argumentul din flush() descris mai sus.

puteți configura valorile implicite ale opțiunilor utilizând al doilea argument al producătorului WebPush :

$ webPush = new WebPush(], );

rezumat

web-push biblioteca facilitează trimiterea notificărilor push web folosind PHP. Obțineți un strat de abstractizare deasupra diferitelor platforme de browser care acceptă procesarea în serie, gestionarea erorilor și toate funcționalitățile de împingere web.

mecanismul de împingere web este un sistem de browser neobișnuit, deoarece se bazează pe componente de la distanță pe server 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 front-end este de obicei aspectul cel mai consumator de timp, mai ales dacă nu utilizați deja funcțiile service worker.

Lasă un răspuns

Adresa ta de email nu va fi publicată.