Sådan sender du Push notifikationer med PHP

PHP Logo

Push API giver dig mulighed for at sende push notifikationer til internetsøgere og API ‘ er. Mens det meste af logikken sker 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.

forudsætninger

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

denne artikel berører ikke koden på siden, eller hvordan den fungerer. Du skal sammensætte 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. en push-abonnement er registreret i bro.ser. En unik endpoint URL til din JavaScript.
  2. dit JavaScript sender abonnementsdataene til din server og identificerer den bruger, 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 leverandørens meddelelsesleveringsplatform. Din JavaScript-servicemedarbejder håndterer den deraf følgende begivenhed og bruger bro.sererens underretnings-API til at advare brugeren.

Sådan implementeres aspekterne på serversiden af trin 1 til 3.

Getting Setup

vi bruger pakken web-push Packagist af minishlink. Dette abstraherer interaktionerne med hver meddelelsesplatform, 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
annonce

for at bruge den nyeste version skal du bruge PHP 7.2 eller nyere med gmp, mbstring, curl, og openssl udvidelser. Hvis du skal bruge en ældre PHP-udgivelse, skal du låse pakken til en tidligere version for at opretholde kompatibilitet.

biblioteket udsætter en kerne WebPush klasse med metoder, der lader dig sende meddelelser individuelt eller som batches. Abonnementer er repræsenteret af forekomster af Subscription klassen.

tilvejebringelse af VAPID-nøgler

tillid til det standardkompatible Net-push-økosystem håndhæves ved brug af VAPID-nøgler. Din server har brug for et VAPID nøglepar, så det kan godkende sig selv til bro.Serere. Den offentlige nøgle skal eksponeres via et API-slutpunkt.

du kan generere et VAPID-nøglesæt ved hjælp af web-push – pakken:

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

Generer nøgler til dit system og gemme dem til 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 opsætte push-abonnementet. Brugerens enhed accepterer indgående push-begivenheder, hvis de er blevet 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 abonnements slutpunkts-URL og tilhørende godkendelsesnøgler til din server. Gem disse oplysninger sammen med Brugerens ID, så du kan hente alle de push-tilmeldte enheder, der er knyttet til brugeren senere.

annonce

vi udelader kodeprøver til dette trin, da implementeringen afhænger af dit datalagringslag og de værdier, dit JavaScript sender op. Typisk vil dette være en JSON-repræsentation af et PushSubscription objekt. Du har brug for et simpelt sæt DATABASESTØTTEDE CRUD API-slutpunkter for at oprette et abonnement, erstatte et eksisterende og anmode om sletning, når brugeren afmelder sig.

forberedelse af abonnementer

når en klient er registreret, kan du begynde at sende meddelelser ved hjælp af web-push biblioteket. Begynd med at oprette en forekomst af WebPush – klassen:

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

du kan genbruge en WebPush forekomst, hver gang du sender en meddelelse. Biblioteket skal konfigureres med det VAPID-nøglesæt, du genererede tidligere. Nøgler skal kodes som Base64, 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.

næste skal du hente push-abonnementet, du sender til. Brug dit dataadgangssystem til at slå de push-Endpoint-URL ‘ er, der er knyttet til den bruger, du vil sende til. Konverter hvert abonnement til en Subscription forekomst:

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

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

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

afsendelse af en meddelelse

kombiner nu dine WebPush og Subscription forekomster for at sende en meddelelse:

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

opkald sendOneNotification() giver øjeblikkelig levering til en enkelt meddelelse. 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 dem som de er og kan fortolke dem efter behov.

afsendelse af en meddelelse returnerer en resultatklasse, der lader dig kontrollere, om operationen lykkedes:

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 leveringen, hvis der opstår en fejl.

annonce

Meddelelsesabonnementer kan også udløbe. Ring til isSubscriptionExpired() – metoden på en resultatklasse for at afgøre, om dette er årsagen til fejlen. Du kan slette abonnementet fra din database i dette scenarie og sikre, at du ikke sender noget andet til et blindgyde.

Batching notifikationer

meddelelser kan batches sammen til levering med en metode opkald:

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

dette er nyttigt, når du ved, at du sender et stort antal meddelelser inden for en kort tidsramme. Sæt alle dine nyttelast i kø, og lad web-push levere dem på den optimale måde.

du kan begrænse antallet af meddelelser, der sendes i en enkelt flush() ved at sende et heltal til metoden:

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

standardværdien er 1000.

Meddelelsesindstillinger

sendOneNotification() og queueNotification() accepter følgende indstillinger som et tredje array-argument:

  • TTL – kontrollerer, hvor længe bro.sererens underretningsplatform holder fast i underretningen, hvis den ikke kan overføres til brugerens enhed med det samme. Hvis brugerens enhed er offline, forsøger platforme 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 TTL ‘ en i overensstemmelse hermed, så brugeren ikke ser forældet indhold.
  • urgency – accepterer normal, low eller very-low som værdier. Nogle platforme kan bruge dette til at justere hyppigheden af meddelelseslevering. Enheder, der går ind i en batteribesparende tilstand, kan suspendere levering af ikke-hastende meddelelser.
  • batchSize – dette har samme virkning som argumentet til flush() beskrevet ovenfor.

du kan konfigurere standardindstillingsværdier ved hjælp af det andet argument til WebPush konstruktøren:

$webPush = new WebPush(], );

oversigt

web-push biblioteket gør det nemt at sende Push-meddelelser via PHP. Du får et abstraktionslag oven på de forskellige bro.serplatforme, der understøtter batching, fejlhåndtering og alle Push-funktioner.

annonce

Push-mekanismen er et usædvanligt bro.ser-system, da det er afhængigt af eksterne server-side komponenter, du leverer selv. Dette kan få det til at virke uigennemsigtigt og teknisk. I praksis er det hurtigt og nemt at oprette en simpel PHP-backend; frontend-implementeringen er normalt det mere tidskrævende aspekt, især hvis du ikke allerede bruger servicemedarbejderfunktioner.

Leave a Reply