Sådan sender du push notifikationer med PHP –

Push API giver dig mulighed for at sende push-meddelelser til Internetsøgere og API ‘ er. Mens det meste af logikken finder sted i bro.ser, Har du stadig brug for en server-side komponent til at generere dine underretninger. Sådan implementeres en push backend ved hjælp af PHP.

oversigt

forudsætninger

med henblik på denne tutorial antager vi, at du kender det grundlæggende ved at opbygge HTTP API ‘ er i PHP. Du bliver nødt til at afsløre et par offentlige slutpunkter ved hjælp af din internetinfrastruktur. Disse vil blive kaldt op af din JavaScript for at registrere og afregistrere enheder.

denne artikel vil ikke dække søgeside kode eller hvordan det virker. Du skal oprette en servicemedarbejder, der reagerer på indgående push-begivenheder og viser en meddelelse til brugeren.

på et højt niveau ser nettet push-strømmen sådan ud:

  1. et push-abonnement gemmes i bro.ser. Den sender en unik endpoint URL til din JavaScript.
  2. dit JavaScript sender abonnementsdata til din server og identificerer den bruger, som det gælder for.
  3. når din backend skal sende en push-meddelelse, skal du oprette en nyttelast og sende den til slutpunktet URL rapporteret som en del af abonnementsdataene.
  4. brugerens bro.ser modtager nyttelasten via udbyderens meddelelsesleveringsplatform. Din JavaScript-servicemedarbejder håndterer den resulterende begivenhed og bruger API ‘ en til at advare brugeren.

Sådan implementeres serversideaspekterne i trin 1 til 3.

få konfiguration

vi bruger pakken web-push Packagiste af minishlink. Dette ignorerer interaktioner med hver bro.ser-underretningsplatform, så du ikke behøver manuelt at skelne mellem slutpunkttyper.

Tilføj pakken til dit projekt ved hjælp af Composer:

composer require minishlink / web-push

for at bruge den nyeste version skal du bruge PHP 7.2 eller højere med gmp, mbstring, curl, og openssl udvidelser. Hvis du skal bruge en ældre version af PHP, skal du låse pakken til en ældre version for at opretholde kompatibilitet.

biblioteket udsætter en kerne WebPush klasse med metoder, der giver dig mulighed for at sende meddelelser individuelt eller i batches. Abonnementerne er repræsenteret af forekomster af Subscription klassifikationen.

Giv VAPID-nøgler

tilliden til det standardkompatible net-push-økosystem forbedres ved brug af VAPID-nøgler. Din server har brug for et VAPID nøglepar for at kunne godkende med bro.sere. Den offentlige nøgle skal eksponeres via et API-slutpunkt.

du kan generere en VAPID nøglering ved hjælp af web-push indpakning:

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

Generer nøgler til dit system og gemme dem i en vedvarende placering. Tilføj et API-slutpunkt, så dit JavaScript på klientsiden kan hente den offentlige nøgle. Dette vil blive brugt til at konfigurere push-abonnementet. Brugerens enhed accepterer indgående push-begivenheder, hvis de er underskrevet ved hjælp af den tilsvarende VAPID private nøgle.

registrering af push-abonnementer

det næste trin i sekvensen er at modtage push-abonnementsanmodninger fra dine kunder. Når du har bekræftet et nyt push-abonnement, skal dit JavaScript sende URL ‘ en til abonnementets slutpunkt og tilhørende godkendelsesnøgler til din server. Gem disse oplysninger med Bruger-ID ‘ et, så du kan hente alle push-tilmeldte enheder, der er knyttet til brugeren senere.

vi udelader kodeeksemplerne til dette trin, fordi implementeringen afhænger af dit datalagringslag og de værdier, der sendes af dit JavaScript. Typisk vil dette være en JSON-repræsentation af et PushSubscription objekt. Du har brug for et simpelt sæt databasebaserede CRUD API-slutpunkter for at oprette et abonnement, erstatte et eksisterende abonnement og anmode om sletning, når brugeren afmelder sig.

forberedelse af abonnementer

når en kunde er registreret, kan du begynde at sende meddelelser ved hjælp af web-push biblioteket. Start med at oprette en forekomst af WebPush for at klassificere:

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

du kan genbruge en WebPush forekomst, hver gang du sender en meddelelse. Biblioteket skal konfigureres med den VAPID-nøglering, du genererede tidligere. Nøglerne skal være Base64 kodet, men dette håndteres for dig, hvis du opretter dem med biblioteket.

VAPID subject bruges til at identificere din server og dens kontaktoplysninger. Du kan angive en hjemmeside URL eller en mailto: e-mail-adresse link.

så skal du få fat i det push-abonnement, du skal sende til. Brug dit dataadgangssystem til at finde de push-Endpoint-URL ‘ er, der er knyttet til den bruger, du vil sende til. Konverter hvert abonnement til et Subscription eksempel:

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

egenskaben auth for PushSubscription gentages to gange for at håndtere to forskellige versioner af specifikationen, der bruges af bro.ser-tjenester. P256dh-ejendommen er en anden offentlig nøgle, der skal leveres, når den er indstillet på abonnementet.

web-push biblioteket er kompatibelt med Chrome og push endpoints. Det vil også arbejde med enhver anden push-implementering, der opfylder den nuværende standard.

afsendelse af en meddelelse

kombiner nu dine WebPush et Subscription instanser til at sende en meddelelse:

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

Appel sendOneNotification() giver øjeblikkelig levering til en enkelt anmeldelse. Nyttelasten i dette tilfælde er et JSON-kodet array med to egenskaber. Det er op til dig, hvilke data du sender, og hvilket format du bruger – din JavaScript-klient modtager den som den er og kan fortolke den efter behov.

afsendelse af en meddelelse returnerer en resultatklasse, der giver dig mulighed for at kontrollere, om operationen var vellykket:

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

du kan tage skridt til at prøve igen eller annullere levering, hvis der opstår en fejl.

abonnementer på meddelelser kan også udløbe. Ring til isSubscriptionExpired() på en resultatklasse for at afgøre, om dette er årsagen til fejlen. Du kan fjerne abonnementet fra din database i dette scenario, og sørg for ikke at sende noget andet til et blindgyde.

Batchmeddelelser

meddelelser kan grupperes sammen for at blive leveret med et enkelt metodeopkald:

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

dette er nyttigt, når du ved, at du vil sende et stort antal meddelelser på kort tid. Sæt alle dine nyttelast i kø, og lad web-push levere dem optimalt.

du kan begrænse antallet af meddelelser sendt i en flush() passerer et heltal til metoden:

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

standard er 1000.

Meddelelsesindstillinger

sendOneNotification() et queueNotification() accepter følgende indstillinger som det tredje argument i arrayet:

  • TTL – kontrollerer, hvor længe underretningsplatformen holder underretningen, hvis den ikke kan leveres til brugerens enhed med det samme. Hvis brugerens enhed er offline, forsøger platformene som standard at levere den i de næste fire uger. Hvis du sender en meddelelse, der ikke er relevant i næste uge, skal du justere alderen i overensstemmelse hermed, så brugeren ikke ser forældet indhold.
  • urgency – Accepter normal, low ou very-low som værdier. Nogle platforme kan bruge det til at justere hyppigheden af meddelelseslevering. Enheder, der går i batteribesparende tilstand, kan suspendere levering af ikke-hastende meddelelser.
  • batchSize – dette har samme virkning som argumentet fra flush() beskrevet ovenfor.

du kan konfigurere standardindstillingsværdierne ved hjælp af det andet argument fra WebPush producenten:

$ webPush = new WebPush(], );

oversigt

web-push biblioteket gør det nemt at sende push-meddelelser via PHP. Du får et lag abstraktion oven på de forskellige bro.serplatforme, der understøtter batchbehandling, fejlhåndtering og al push-funktionalitet.

push-mekanismen er et usædvanligt system, fordi det er afhængigt af eksterne server-side komponenter, som du giver dig selv. Dette kan få det til at virke uigennemsigtigt og teknisk. I praksis er det hurtigt og nemt at oprette en simpel PHP-backend; front-end-implementeringen er normalt det mest tidskrævende aspekt, især hvis du ikke allerede bruger servicemedarbejderfunktioner.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.