Codelab: creare un server di notifica push

Kate Jeffreys
Kate Jeffreys

Questo codelab mostra, passo passo, come creare un server di notifiche push. Al termine del codelab avrai un server che:

  • Tiene traccia delle iscrizioni alle notifiche push (ad es.il server crea un nuovo record di database quando un client attiva le notifiche push ed elimina un record di database esistente quando un client disattiva questa opzione).
  • Invia una notifica push a un singolo cliente
  • Invia una notifica push a tutti i client iscritti

Questo codelab è incentrato sull'apprendimento pratico e non discute molto i concetti. Consulta l'articolo Come funzionano le notifiche push? per saperne di più sui concetti di notifiche push.

Il codice client di questo codelab è già completo. In questo codelab implementerai solo il server. Per scoprire come implementare un client di notifiche push, consulta il codelab Crea un client di notifiche push.

Consulta push-notifications-server-codelab-complete (source) per visualizzare il codice completo.

Compatibilità del browser

Questo codelab è noto per funzionare con le seguenti combinazioni di sistema operativo e browser:

  • Windows: Chrome, Edge
  • macOS: Chrome, Firefox
  • Android: Chrome, Firefox

È noto che questo codelab non funziona con i seguenti sistemi operativi (o combinazioni di sistemi operativi e browser):

  • macOS: Brave, Edge, Safari
  • iOS

Stack di applicazioni

  • Il server è basato su Express.js.
  • La libreria Node.js web-push gestisce tutta la logica di notifica push.
  • I dati dell'abbonamento vengono scritti in un file JSON utilizzando lowdb.

Non è necessario utilizzare nessuna di queste tecnologie per implementare le notifiche push. Abbiamo scelto queste tecnologie perché offrono un'esperienza affidabile con Codelab.

Configurazione

Ottenere una copia modificabile del codice

L'editor di codice che vedi a destra di queste istruzioni verrà chiamato interfaccia utente Glitch per tutto il codelab.

  1. Fai clic su Remix per modificare per rendere il progetto modificabile.

Configura l'autenticazione

Prima di poter utilizzare le notifiche push, devi configurare il server e il client con le chiavi di autenticazione. Per scoprire il motivo, consulta Firmare le richieste del protocollo web push.

  1. Apri il terminale di Glitch facendo clic su Strumenti e poi su Terminale.
  2. Nel terminale, esegui npx web-push generate-vapid-keys. Copia i valori della chiave privata e della chiave pubblica.
  3. Apri .env e aggiorna VAPID_PUBLIC_KEY e VAPID_PRIVATE_KEY. Imposta VAPID_SUBJECT su mailto:test@test.test. Tutti questi valori devono essere racchiusi tra virgolette doppie. Dopo aver apportato gli aggiornamenti, il file .env dovrebbe avere un aspetto simile al seguente:
VAPID_PUBLIC_KEY="BKiwTvD9HA…"
VAPID_PRIVATE_KEY="4mXG9jBUaU…"
VAPID_SUBJECT="mailto:test@test.test"
  1. Chiudi il terminale Glitch.
  1. Apri public/index.js.
  2. Sostituisci VAPID_PUBLIC_KEY_VALUE_HERE con il valore della chiave pubblica.

Gestisci sottoscrizioni

Il cliente gestisce la maggior parte della procedura di abbonamento. Le operazioni principali che il server deve svolgere sono salvare le nuove iscrizioni alle notifiche push ed eliminare quelle precedenti. Queste iscrizioni ti consentono di spingere i messaggi ai clienti in futuro. Per ulteriori informazioni sulla procedura di sottoscrizione, consulta la sezione Registrare il cliente alle notifiche push.

Salvare le informazioni del nuovo abbonamento

  1. Per visualizzare l'anteprima del sito, premi Visualizza app, quindi premi A schermo intero schermo intero.
  1. Fai clic su Registra il servizio worker nella scheda dell'app. Nella finestra di stato dovresti vedere un messaggio simile al seguente:
Service worker registered. Scope: https://desert-cactus-sunset.glitch.me/
  1. Nella scheda dell'app, fai clic su Iscriviti per ricevere notifiche push. Probabilmente il browser o il sistema operativo ti chiederà se vuoi consentire al sito web di inviarti notifiche push. Fai clic su Consenti (o su qualsiasi frase equivalente utilizzata dal browser/dal sistema operativo). Nella casella dello stato dovresti vedere un messaggio simile al seguente:
Service worker subscribed to push.  Endpoint: https://fcm.googleapis.com/fcm/send/…
  1. Torna al codice facendo clic su Visualizza codice sorgente nell'interfaccia utente di Glitch.
  2. Apri i log di Glitch facendo clic su Strumenti e poi su Log. Dovresti vedere /add-subscription seguito da alcuni dati. /add-subscription è l'URL a cui il client invia una richiesta POST quando vuole iscriversi alle notifiche push. I dati che segue sono le informazioni sull'abbonamento del cliente che devi salvare.
  3. Apri server.js.
  4. Aggiorna la logica dell'handler route /add-subscription con il seguente codice:
app.post('/add-subscription', (request, response) => {
  console.log('/add-subscription');
  console.log(request.body);
  console.log(`Subscribing ${request.body.endpoint}`);
  db.get('subscriptions')
    .push(request.body)
    .write();
  response.sendStatus(200);
});

Eliminare le informazioni dell'abbonamento precedente

  1. Torna alla scheda dell'app.
  2. Fai clic su Annulla l'iscrizione alle notifiche push.
  3. Esamina di nuovo i log degli errori. Dovresti vedere /remove-subscription seguito dai dati dell'abbonamento del cliente.
  4. Aggiorna la logica dell'handler route /remove-subscription con il seguente codice:
app.post('/remove-subscription', (request, response) => {
  console.log('/remove-subscription');
  console.log(request.body);
  console.log(`Unsubscribing ${request.body.endpoint}`);
  db.get('subscriptions')
    .remove({endpoint: request.body.endpoint})
    .write();
  response.sendStatus(200);
});

Inviare notifiche

Come spiegato in Inviare un messaggio push, in realtà il server non invia i messaggi push direttamente ai client. ma si basa su un servizio push. In pratica, il server avvia il processo di invio dei messaggi ai client inviando richieste di servizio web (richieste di protocollo push web) a un servizio web (il servizio push) di proprietà del fornitore del browser utilizzato dall'utente.

  1. Aggiorna la logica dell'handler route /notify-me con il seguente codice:
app.post('/notify-me', (request, response) => {
  console.log('/notify-me');
  console.log(request.body);
  console.log(`Notifying ${request.body.endpoint}`);
  const subscription = 
      db.get('subscriptions').find({endpoint: request.body.endpoint}).value();
  sendNotifications([subscription]);
  response.sendStatus(200);
});
  1. Aggiorna la funzione sendNotifications() con il seguente codice:
function sendNotifications(subscriptions) {
  // TODO
  // Create the notification content.
  const notification = JSON.stringify({
    title: "Hello, Notifications!",
    options: {
      body: `ID: ${Math.floor(Math.random() * 100)}`
    }
  });
  // Customize how the push service should attempt to deliver the push message.
  // And provide authentication information.
  const options = {
    TTL: 10000,
    vapidDetails: vapidDetails
  };
  // Send a push message to each client specified in the subscriptions array.
  subscriptions.forEach(subscription => {
    const endpoint = subscription.endpoint;
    const id = endpoint.substr((endpoint.length - 8), endpoint.length);
    webpush.sendNotification(subscription, notification, options)
      .then(result => {
        console.log(`Endpoint ID: ${id}`);
        console.log(`Result: ${result.statusCode}`);
      })
      .catch(error => {
        console.log(`Endpoint ID: ${id}`);
        console.log(`Error: ${error} `);
      });
  });
}
  1. Aggiorna la logica dell'handler route /notify-all con il seguente codice:
app.post('/notify-all', (request, response) => {
  console.log('/notify-all');
  response.sendStatus(200);
  console.log('Notifying all subscribers');
  const subscriptions =
      db.get('subscriptions').cloneDeep().value();
  if (subscriptions.length > 0) {
    sendNotifications(subscriptions);
    response.sendStatus(200);
  } else {
    response.sendStatus(409);
  }
});
  1. Torna alla scheda dell'app.
  2. Fai clic su Annulla iscrizione alle notifiche push e poi di nuovo su Iscriviti alle notifiche push. Questo è necessario solo perché, come accennato in precedenza, Glitch riavvia il progetto ogni volta che modifichi il codice e il progetto è configurato per eliminare il database all'avvio.
  3. Fai clic su Avvisami. Dovresti ricevere una notifica push. Il titolo deve essere Hello, Notifications! e il corpo deve essere ID: <ID>, dove <ID> è un numero random.
  4. Apri l'app su altri browser o dispositivi e prova a iscriverli alle notifiche push, quindi fai clic sul pulsante Avvisa tutti. Dovresti ricevere la stessa notifica su tutti i dispositivi su cui hai effettuato l'iscrizione (ovvero l'ID nel corpo della notifica push dovrebbe essere lo stesso).

Passaggi successivi

  • Leggi la Panoramica delle notifiche push per una comprensione concettuale più approfondita del funzionamento delle notifiche push.
  • Consulta il Codelab: crea un client di notifiche push per scoprire come creare un client che richieda l'autorizzazione di notifica, registri il dispositivo per ricevere notifiche push e utilizzi un service worker per ricevere i messaggi push e visualizzarli come notifiche.