Come inviare notifiche push web con PHP –

Web Push API consente di inviare notifiche push ai browser Web e API. Mentre la maggior parte della logica si svolge nel browser, è comunque necessario un componente lato server per generare le notifiche. Ecco come implementare un backend push web usando PHP.

Sommario

Precondizioni

Ai fini di questo tutorial, assumeremo che tu conosca le basi della creazione di API HTTP in PHP. Sarà necessario esporre alcuni endpoint pubblici utilizzando l’infrastruttura Web. Questi verranno richiamati dal JavaScript del tuo browser per registrare e cancellare i dispositivi.

Questo articolo non copre il codice lato browser o come funziona. Sarà necessario impostare un operatore del servizio che risponda agli eventi push in entrata e visualizzi una notifica all’utente.

Ad un livello elevato, il flusso di spinta web è simile a questo:

  1. Un abbonamento push viene salvato nel browser. Il browser invia un URL endpoint univoco al tuo JavaScript.
  2. Il tuo JavaScript invia i dati di sottoscrizione al tuo server e identifica l’utente a cui si applica.
  3. Quando il backend deve inviare una notifica push, creare un payload e inviarlo all’URL dell’endpoint segnalato come parte dei dati di sottoscrizione.
  4. Il browser dell’utente riceverà il payload attraverso la piattaforma di consegna delle notifiche del provider. L’operatore del servizio JavaScript gestisce l’evento risultante e utilizza l’API di notifica del browser per avvisare l’utente.

Ecco come implementare gli aspetti lato server dei passaggi da 1 a 3.

Ottieni configurazione

Useremo il pacchetto Packagiste web-push di minishlink. Questo non tiene conto delle interazioni con ogni piattaforma di notifica del browser in modo da non dover distinguere manualmente i tipi di endpoint.

Aggiungi il pacchetto al tuo progetto usando Composer:

composer require minishlink / web-push

Per utilizzare l’ultima versione è necessario PHP 7.2 o superiore con il gmp, mbstring, curl, e openssl estensioni. Se è necessario utilizzare una versione precedente di PHP, bloccare il pacchetto in una versione precedente per mantenere la compatibilità.

La libreria espone una classe kernel WebPush con metodi che consentono di inviare notifiche singolarmente o in batch. Le sottoscrizioni sono rappresentate da istanze di classificazione Subscription.

Fornire chiavi VAPID

La fiducia nell’ecosistema web push conforme agli standard è migliorata dall’uso di chiavi VAPID. Il tuo server ha bisogno di una coppia di chiavi VAPID per essere in grado di autenticarsi con i browser. La chiave pubblica deve essere esposta tramite un endpoint API.

È possibile generare un anello chiave INSULSO utilizzando l’involucro web-push :

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 chiavi per il tuo sistema e memorizzale in una posizione persistente. Aggiungi un endpoint API in modo che il tuo JavaScript lato client possa recuperare la chiave pubblica. Questo verrà utilizzato per configurare l’abbonamento push del browser. Il dispositivo dell’utente accetterà gli eventi push in arrivo se sono stati firmati utilizzando la chiave privata VAPID corrispondente.

Registrazione di abbonamenti push

Il passo successivo nella sequenza consiste nel ricevere richieste di abbonamento push dai clienti. Dopo che il browser ha confermato una nuova sottoscrizione push, JavaScript deve inviare l’URL dell’endpoint di sottoscrizione e le chiavi di autenticazione associate al server. Memorizzare questi dettagli con l’ID utente in modo da poter recuperare eventuali dispositivi registrati push collegati all’utente in un secondo momento.

Omettiamo gli esempi di codice per questo passaggio perché l’implementazione dipende dal livello di archiviazione dei dati e dai valori inviati dal tuo JavaScript. In genere questa sarà una rappresentazione JSON di un oggetto PushSubscription. È necessario un semplice set di endpoint API CRUD basati su database per creare una sottoscrizione, sostituire una sottoscrizione esistente e richiedere l’eliminazione quando l’utente annulla l’iscrizione.

Preparazione degli abbonamenti

Una volta registrato un cliente, è possibile iniziare a inviare notifiche utilizzando la libreria web-push. Inizia creando un’istanza di WebPush da classificare:

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

È possibile riutilizzare un’istanza WebPush ogni volta che si invia una notifica. La libreria deve essere configurata con l’anello chiave VAPID generato in precedenza. Le chiavi devono essere codificate Base64, ma questo viene gestito per te se le crei con la libreria.

VAPID subject viene utilizzato per identificare il server e i suoi dettagli di contatto. È possibile fornire un URL del sito web o un link all’indirizzo e-mail mailto:.

Quindi è necessario afferrare l’abbonamento push a cui si sta per inviare. Utilizzare il sistema di accesso ai dati per trovare gli URL degli endpoint push associati all’utente a cui si desidera inviare. Converti ogni abbonamento in un esempio Subscription :

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

La proprietà auth di PushSubscription viene ripetuta due volte per gestire due diverse versioni delle specifiche utilizzate dai servizi browser. La proprietà P256DH è un’altra chiave pubblica che deve essere fornita quando impostata sulla sottoscrizione.

web-push La libreria è compatibile con gli endpoint push di Chrome e Firefox. Funzionerà anche con qualsiasi altra implementazione push web che soddisfi lo standard corrente.

l’Invio di una notifica

Ora combinare la vostra WebPush et Subscription istanze per l’invio di una notifica:

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

Appel sendOneNotification() fornisce la consegna immediata per una singola notifica. Il payload in questo caso è un array codificato JSON con due proprietà. Sta a te quali dati invii e quale formato usi: il tuo client JavaScript lo riceve così com’è e può interpretarlo secondo necessità.

l’Invio di una notifica restituisce un risultato di classe che consente di verificare se l’operazione è stata un successo:

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

Si può prendere misure per riprovare o annullare la consegna se si verifica un errore.

Anche gli abbonamenti alle notifiche possono scadere. Chiamare isSubscriptionExpired() su una classe result per determinare se questo è il motivo dell’errore. È possibile rimuovere la sottoscrizione dal database in questo scenario, facendo attenzione a non inviare altro a un punto morto.

Batch notifiche

Notifiche possono essere raggruppati insieme per essere inviato con una singola chiamata al metodo:

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

Questo è utile quando si sa che si sta per inviare un gran numero di notifiche in un breve periodo di tempo. Accoda tutti i tuoi payload e lascia che web-push li fornisca in modo ottimale.

È possibile limitare il numero di notifiche inviate in una flush() passando un numero intero al metodo:

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

Il valore predefinito è 1000.

Opzioni di notifica

sendOneNotification() et queueNotification() accetta le seguenti opzioni come terzo argomento dell’array:

  • TTL – Controlla per quanto tempo la piattaforma di notifica del browser manterrà la notifica se non può essere consegnata immediatamente al dispositivo dell’utente. Se il dispositivo dell’utente è offline, le piattaforme cercheranno di consegnarlo per le prossime quattro settimane per impostazione predefinita. Se invii una notifica che non sarà rilevante la prossima settimana, regola l’età di conseguenza in modo che l’utente non veda contenuti obsoleti.
  • urgency – Accetta normal, low ou very-low come valori. Alcune piattaforme potrebbero utilizzarlo per regolare la frequenza di consegna delle notifiche. I dispositivi che entrano in modalità di risparmio della batteria possono sospendere la consegna di notifiche non urgenti.
  • batchSize – Questo ha lo stesso effetto dell’argomento di flush() descritto sopra.

È possibile configurare i valori delle opzioni predefinite utilizzando il secondo argomento del produttore WebPush :

$ webPush = new WebPush(], );

Sommario

Il web-push La libreria rende facile inviare notifiche push web utilizzando PHP. Si ottiene un livello di astrazione sulle diverse piattaforme del browser che supporta l’elaborazione batch, la gestione degli errori e tutte le funzionalità di push web.

Il meccanismo web push è un sistema di browser insolito perché si basa su componenti remoti lato server forniti da te stesso. Questo può farlo apparire opaco e tecnico. In pratica, la creazione di un semplice backend PHP è semplice e veloce; l’implementazione front-end è di solito l’aspetto più dispendioso in termini di tempo, specialmente se non stai già utilizzando le funzionalità di service worker.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.