À ce stade, nous avons abordé l'abonnement d'un utilisateur et l'envoi d'un message push. L'étape suivante consiste à recevoir ce message push sur l'appareil de l'utilisateur et afficher une notification (ainsi que toute autre travail que nous pourrions effectuer).
L'événement push
Lorsqu'un message est reçu, un événement push est envoyé à votre service worker.
Le code de configuration d'un écouteur d'événements push doit être assez semblable à celui de tout autre événement que vous écririez en JavaScript:
self.addEventListener('push', function(event) {
if (event.data) {
console.log('This push event has data: ', event.data.text());
} else {
console.log('This push event has no data.');
}
});
L'aspect le plus étrange de ce code pour la plupart des développeurs qui débutent avec les service workers est le self
.
. self
est couramment utilisé dans les Web Workers, ce qu'est un service worker. self
fait référence à
le champ d'application global, un peu comme window
dans une page Web. Mais pour les travailleurs Web et les service workers,
self
fait référence au nœud de calcul lui-même.
Dans l'exemple ci-dessus, self.addEventListener()
peut être considéré comme l'ajout d'un écouteur d'événements à
le service worker lui-même.
Dans l'exemple d'événement push, nous vérifions s'il existe des données et imprimons quelque chose dans la console.
Il existe d'autres façons d'analyser les données d'un événement d'envoi:
// Returns string
event.data.text()
// Parses data as JSON string and returns an Object
event.data.json()
// Returns blob of data
event.data.blob()
// Returns an arrayBuffer
event.data.arrayBuffer()
La plupart des utilisateurs utilisent json()
ou text()
en fonction de ce qu'ils attendent de leur application.
Cet exemple montre comment ajouter un écouteur d'événements push et accéder aux données.
il manque deux fonctions
très importantes. Il n'affiche aucune notification
et il est
n'utilise pas event.waitUntil()
.
Attendre jusqu'à
L'une des choses à savoir sur les service workers, c'est que vous avez peu de contrôle sur le moment
le code de service s'exécute. Le navigateur décide à quel moment l'activer et le
l'arrêter. La seule façon de dire au navigateur : « Hé, je suis super occupé à faire
"trucs", consiste à transmettre une promesse à la méthode event.waitUntil()
. Ainsi, le navigateur
maintenir le service worker en cours d'exécution jusqu'à ce que la promesse que vous avez transmise soit établie.
Avec les événements push, vous devez afficher une notification avant la promesse que vous avez faite est réglée.
Voici un exemple basique d'affichage d'une notification:
self.addEventListener('push', function(event) {
const promiseChain = self.registration.showNotification('Hello, World.');
event.waitUntil(promiseChain);
});
L'appel de self.registration.showNotification()
est la méthode qui permet d'afficher une notification pour
l'utilisateur et il renvoie une promesse qui se résoudre
une fois la notification affichée.
Pour que cet exemple soit aussi clair que possible, j'ai confié cette promesse à un
appelée promiseChain
. Elle est ensuite transmise à event.waitUntil()
. Je sais que c'est
très détaillée, mais j'ai vu un certain nombre
de problèmes qui se sont soldés par une
mal comprendre ce qui doit être transmis à waitUntil()
ou être le résultat d'une promesse non respectée
chaînes.
Un exemple plus compliqué avec une demande réseau de données et le suivi de l'événement push avec l’analytique pourrait ressembler à ceci:
self.addEventListener('push', function(event) {
const analyticsPromise = pushReceivedTracking();
const pushInfoPromise = fetch('/api/get-more-data')
.then(function(response) {
return response.json();
})
.then(function(response) {
const title = response.data.userName + ' says...';
const message = response.data.message;
return self.registration.showNotification(title, {
body: message
});
});
const promiseChain = Promise.all([
analyticsPromise,
pushInfoPromise
]);
event.waitUntil(promiseChain);
});
Ici, nous appelons une fonction qui renvoie une promesse pushReceivedTracking()
,
Pour les besoins de cet exemple, nous pouvons prétendre qu'il enverra une requête réseau
à notre fournisseur de solution d'analyse. Nous effectuons aussi une requête réseau, obtenant
et en affichant une notification utilisant les données des réponses pour le titre et
le message de la notification.
Pour nous assurer que le service worker reste actif pendant que ces deux tâches sont effectuées, nous combinons
ces promesses avec Promise.all()
. La promesse obtenue est transmise à event.waitUntil()
.
Cela signifie que le navigateur attend que les deux promesses soient terminées avant de vérifier qu'une notification
et l'arrêt du service worker.
Nous devons nous soucier de waitUntil()
et de son utilisation, car il s'agit
les développeurs sont confrontés à un problème courant : si la chaîne de promesses est incorrecte ou non fonctionnelle, Chrome
afficher "default" notification:
Chrome affiche uniquement le message "Ce site a été mis à jour en arrière-plan". une notification lorsqu'un
message push reçu et l'événement push du service worker n'affiche pas de message
une fois la promesse transmise à event.waitUntil()
terminée.
La principale raison pour laquelle les développeurs sont interceptés par ce problème est que leur code
appellent souvent self.registration.showNotification()
, mais ils ne fonctionnent pas
avec la promesse qu'elle renvoie. La notification par défaut s'affiche par intermittence
en cours d'affichage. Par exemple, nous
pouvons supprimer le retour pour
self.registration.showNotification()
dans l'exemple ci-dessus, et nous risquons de voir ceci
.
self.addEventListener('push', function(event) {
const analyticsPromise = pushReceivedTracking();
const pushInfoPromise = fetch('/api/get-more-data')
.then(function(response) {
return response.json();
})
.then(function(response) {
const title = response.data.userName + ' says...';
const message = response.data.message;
self.registration.showNotification(title, {
body: message
});
});
const promiseChain = Promise.all([
analyticsPromise,
pushInfoPromise
]);
event.waitUntil(promiseChain);
});
Comme vous pouvez le voir, il est facile de passer à côté.
N'oubliez pas : si cette notification s'affiche, vérifiez vos chaînes de promesses et event.waitUntil()
.
Dans la section suivante, nous allons voir ce que nous pouvons faire pour styliser les notifications et le contenu que nous pouvons afficher.
Étapes suivantes
- Présentation des notifications push Web
- Fonctionnement du mode Push
- S'abonner à un utilisateur
- Expérience utilisateur des autorisations
- Envoyer des messages à l'aide des bibliothèques Web Push
- Protocole Web Push
- Gérer les événements push
- Afficher une notification
- Comportement des notifications
- Formats de notification courants
- Questions fréquentes sur les notifications push
- Problèmes courants et signalement de bugs