Cet atelier de programmation vous montre, étape par étape, comment créer un client de notifications push. À la fin de cet atelier de programmation, vous disposerez d'un client qui :
- Abonne l'utilisateur aux notifications push.
- Reçoit les messages push et les affiche sous forme de notifications.
- Désabonne l'utilisateur des notifications push.
Cet atelier de programmation vise à vous aider à apprendre en pratiquant et ne traite pas beaucoup de concepts. Consultez Comment fonctionnent les notifications push ? pour en savoir plus sur les concepts liés aux notifications push.
Le code du serveur de cet atelier de programmation est déjà complet. Dans cet atelier de programmation, vous n'implémenterez que le client. Pour savoir comment implémenter un serveur de notifications push, consultez l'atelier de programmation : créer un serveur de notifications push.
Compatibilité du navigateur
Cet atelier de programmation est réputé fonctionner avec les combinaisons de système d'exploitation et de navigateur suivantes :
- Windows : Chrome, Edge
- macOS : Chrome, Firefox
- Android : Chrome, Firefox
Cet atelier de programmation est réputé ne pas fonctionner avec les systèmes d'exploitation (ou combinaisons de système d'exploitation et de navigateur) suivants :
- macOS : Brave, Edge, Safari
- iOS
Configuration
Obtenir une copie modifiable du code
- Cliquez sur Remix to Edit (Remixer pour modifier) pour rendre le projet modifiable.
Configurer l'authentification
Avant de pouvoir recevoir des notifications push, vous devez configurer votre serveur et votre client avec des clés d'authentification. Pour en savoir plus, consultez Signer vos requêtes de protocole Web Push. En règle générale, vous stockez les secrets dans un fichier .env
, comme celui-ci.
VAPID_PUBLIC_KEY="BKiwTvD9HA…" VAPID_PRIVATE_KEY="4mXG9jBUaU…" VAPID_SUBJECT="mailto:[email protected]"
- Ouvrez
public/index.js
. - Remplacez
VAPID_PUBLIC_KEY_VALUE_HERE
par la valeur de votre clé publique.
Enregistrer un service worker
Votre client aura besoin d'un service worker pour recevoir et afficher les notifications. Il est préférable d'enregistrer le service worker le plus tôt possible. Pour en savoir plus, consultez Recevoir et afficher les messages push sous forme de notifications.
- Remplacez le commentaire
// TODO add startup logic here
par le code suivant :
// TODO add startup logic here if ('serviceWorker' in navigator && 'PushManager' in window) { navigator.serviceWorker.register('./service-worker.js').then(serviceWorkerRegistration => { console.info('Service worker was registered.'); console.info({serviceWorkerRegistration}); }).catch(error => { console.error('An error occurred while registering the service worker.'); console.error(error); }); subscribeButton.disabled = false; } else { console.error('Browser does not support service workers or push messages.'); } subscribeButton.addEventListener('click', subscribeButtonHandler); unsubscribeButton.addEventListener('click', unsubscribeButtonHandler);
- Appuyez sur Ctrl+Maj+J (ou Cmd+Option+J sur Mac) pour ouvrir les outils de développement.
- Cliquez sur l'onglet Console. Le message
Service worker was registered.
doit s'afficher dans la console.
Demander l'autorisation d'envoyer des notifications push
Vous ne devez jamais demander l'autorisation d'envoyer des notifications push au chargement de la page. Votre UI doit plutôt demander à l'utilisateur s'il souhaite recevoir des notifications push. Une fois que l'utilisateur a explicitement confirmé (en cliquant sur un bouton, par exemple), vous pouvez lancer le processus formel pour obtenir l'autorisation d'envoyer des notifications push depuis le navigateur.
- Dans
public/index.js
, remplacez le commentaire// TODO
danssubscribeButtonHandler()
par le code suivant :
// TODO // Prevent the user from clicking the subscribe button multiple times. subscribeButton.disabled = true; const result = await Notification.requestPermission(); if (result === 'denied') { console.error('The user explicitly denied the permission request.'); return; } if (result === 'granted') { console.info('The user accepted the permission request.'); }
- Revenez à l'onglet de l'application et cliquez sur Subscribe to push (S'abonner aux notifications push). Votre navigateur ou votre système d'exploitation vous demanderont probablement si vous souhaitez autoriser le site Web à vous envoyer des notifications push. Cliquez sur Autoriser (ou sur l'expression équivalente utilisée par votre navigateur ou votre système d'exploitation). Dans la console, un message doit indiquer si la demande a été acceptée ou refusée.
S'abonner aux notifications push
Le processus d'abonnement implique une interaction avec un service Web contrôlé par le fournisseur du navigateur, appelé service push. Une fois que vous avez obtenu les informations d'abonnement aux notifications push, vous devez les envoyer à un serveur et les faire stocker à long terme dans une base de données. Pour en savoir plus sur le processus d'abonnement, consultez Abonner le client aux notifications push.
- Ajoutez le code mis en surbrillance suivant à
subscribeButtonHandler()
:
subscribeButton.disabled = true; const result = await Notification.requestPermission(); if (result === 'denied') { console.error('The user explicitly denied the permission request.'); return; } if (result === 'granted') { console.info('The user accepted the permission request.'); } const registration = await navigator.serviceWorker.getRegistration(); const subscribed = await registration.pushManager.getSubscription(); if (subscribed) { console.info('User is already subscribed.'); notifyMeButton.disabled = false; unsubscribeButton.disabled = false; return; } const subscription = await registration.pushManager.subscribe({ userVisibleOnly: true, applicationServerKey: urlB64ToUint8Array(VAPID_PUBLIC_KEY) }); notifyMeButton.disabled = false; fetch('/add-subscription', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(subscription) });
L'option userVisibleOnly
doit être définie sur true
. Il sera peut-être un jour possible d'envoyer des messages sans afficher de notifications visibles par l'utilisateur (notifications push silencieuses), mais les navigateurs ne le permettent pas actuellement en raison de problèmes de confidentialité.
La valeur applicationServerKey
repose sur une fonction utilitaire qui convertit une chaîne base64 en Uint8Array. Cette valeur est utilisée pour l'authentification entre votre serveur et le service de notification push.
Se désabonner des notifications push
Une fois qu'un utilisateur s'est abonné aux notifications push, votre UI doit lui permettre de se désabonner s'il change d'avis et ne souhaite plus recevoir de notifications push.
- Remplacez le commentaire
// TODO
dansunsubscribeButtonHandler()
par le code suivant :
// TODO const registration = await navigator.serviceWorker.getRegistration(); const subscription = await registration.pushManager.getSubscription(); fetch('/remove-subscription', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({endpoint: subscription.endpoint}) }); const unsubscribed = await subscription.unsubscribe(); if (unsubscribed) { console.info('Successfully unsubscribed from push notifications.'); unsubscribeButton.disabled = true; subscribeButton.disabled = false; notifyMeButton.disabled = true; }
Recevoir un message push et l'afficher sous forme de notification
Comme indiqué précédemment, vous avez besoin d'un service worker pour gérer la réception et l'affichage des messages envoyés au client depuis votre serveur. Pour en savoir plus, consultez Recevoir et afficher les messages push sous forme de notifications.
- Ouvrez
public/service-worker.js
et remplacez le commentaire// TODO
dans le gestionnaire d'événementspush
du service worker par le code suivant :
// TODO let data = event.data.json(); const image = 'logo.png'; const options = { body: data.options.body, icon: image } self.registration.showNotification( data.title, options );
- Revenez à l'onglet de l'application.
- Cliquez sur M'avertir. Vous devriez recevoir une notification push.
- Essayez d'ouvrir l'URL de l'onglet de votre application dans d'autres navigateurs (ou même sur d'autres appareils), de suivre le processus d'abonnement, puis de cliquer sur Notifier tout le monde. Vous devriez recevoir la même notification push sur tous les navigateurs auxquels vous êtes abonné. Reportez-vous à la section Compatibilité des navigateurs pour obtenir la liste des combinaisons navigateur/OS connues pour fonctionner ou non.
Vous pouvez personnaliser la notification de nombreuses façons. Pour en savoir plus, consultez les paramètres de ServiceWorkerRegistration.showNotification()
.
Ouvrir une URL lorsqu'un utilisateur clique sur une notification
Dans le monde réel, vous utiliserez probablement la notification pour réengager votre utilisateur et l'inciter à visiter votre site. Pour ce faire, vous devez configurer un peu plus votre service worker.
- Remplacez le commentaire
// TODO
dans le gestionnaire d'événementsnotificationclick
du service worker par le code suivant :
// TODO event.notification.close(); event.waitUntil(self.clients.openWindow('https://web.dev'));
- Revenez à l'onglet de l'application, envoyez-vous une autre notification, puis cliquez dessus. Votre navigateur doit ouvrir un nouvel onglet et charger
https://web.dev
.
Étapes suivantes
- Consultez
ServiceWorkerRegistration.showNotification()
pour découvrir toutes les façons de personnaliser les notifications. - Pour mieux comprendre le fonctionnement des notifications push, consultez Présentation des notifications push.
- Consultez l'atelier de programmation : Créer un serveur de notifications push pour découvrir comment créer un serveur qui gère les abonnements et envoie des requêtes de protocole Web Push.
- Essayez le générateur de notifications pour tester toutes les façons de personnaliser les notifications.