Recevoir des messages dans un client JavaScript

Le comportement des messages diffère selon que la page est au premier plan (a le focus), ou en arrière-plan, cachée derrière d'autres onglets, ou complètement fermée. Dans tous les cas, la page doit gérer le rappel onMessage , mais dans les cas en arrière-plan, vous devrez peut-être également gérer onBackgroundMessage ou configurer la notification d'affichage pour permettre à l'utilisateur de mettre votre application Web au premier plan.

État de l'application Notification Données Les deux
Premier plan onMessage onMessage onMessage
Contexte (travailleur de service) onBackgroundMessage (notification d'affichage automatiquement affichée) onBackgroundMessage onBackgroundMessage (notification d'affichage automatiquement affichée)

L' exemple de démarrage rapide JavaScript montre tout le code requis pour recevoir des messages.

Gérer les messages lorsque votre application Web est au premier plan

Afin de recevoir l'événement onMessage , votre application doit définir le travailleur du service de messagerie Firebase dans firebase-messaging-sw.js . Vous pouvez également fournir un service worker existant au SDK via getToken(): Promise<string> .

Web modular API

import { initializeApp } from "firebase/app";
import { getMessaging } from "firebase/messaging/sw";

// Initialize the Firebase app in the service worker by passing in
// your app's Firebase config object.
// https://firebase.google.com/docs/web/setup#config-object
const firebaseApp = initializeApp({
  apiKey: 'api-key',
  authDomain: 'project-id.firebaseapp.com',
  databaseURL: 'https://project-id.firebaseio.com',
  projectId: 'project-id',
  storageBucket: 'project-id.appspot.com',
  messagingSenderId: 'sender-id',
  appId: 'app-id',
  measurementId: 'G-measurement-id',
});

// Retrieve an instance of Firebase Messaging so that it can handle background
// messages.
const messaging = getMessaging(firebaseApp);

Web namespaced API

// Give the service worker access to Firebase Messaging.
// Note that you can only use Firebase Messaging here. Other Firebase libraries
// are not available in the service worker.
importScripts('https://www.gstatic.com/firebasejs/8.10.1/firebase-app.js');
importScripts('https://www.gstatic.com/firebasejs/8.10.1/firebase-messaging.js');

// Initialize the Firebase app in the service worker by passing in
// your app's Firebase config object.
// https://firebase.google.com/docs/web/setup#config-object
firebase.initializeApp({
  apiKey: 'api-key',
  authDomain: 'project-id.firebaseapp.com',
  databaseURL: 'https://project-id.firebaseio.com',
  projectId: 'project-id',
  storageBucket: 'project-id.appspot.com',
  messagingSenderId: 'sender-id',
  appId: 'app-id',
  measurementId: 'G-measurement-id',
});

// Retrieve an instance of Firebase Messaging so that it can handle background
// messages.
const messaging = firebase.messaging();

Lorsque votre application est au premier plan (l'utilisateur consulte actuellement votre page Web), vous pouvez recevoir des données et des charges utiles de notification directement dans la page.

Web modular API

// Handle incoming messages. Called when:
// - a message is received while the app has focus
// - the user clicks on an app notification created by a service worker
//   `messaging.onBackgroundMessage` handler.
import { getMessaging, onMessage } from "firebase/messaging";

const messaging = getMessaging();
onMessage(messaging, (payload) => {
  console.log('Message received. ', payload);
  // ...
});

Web namespaced API

// Handle incoming messages. Called when:
// - a message is received while the app has focus
// - the user clicks on an app notification created by a service worker
//   `messaging.onBackgroundMessage` handler.
messaging.onMessage((payload) => {
  console.log('Message received. ', payload);
  // ...
});

Gérer les messages lorsque votre application Web est en arrière-plan

Tous les messages reçus alors que l'application est en arrière-plan déclenchent une notification d'affichage dans le navigateur. Vous pouvez spécifier des options pour cette notification, telles que le titre ou l'action de clic, soit dans la demande d'envoi de votre serveur d'applications, soit à l'aide de la logique du service worker sur le client.

Définition des options de notification dans la demande d'envoi

Pour les messages de notification envoyés depuis le serveur d'applications, l'API JavaScript FCM prend en charge la clé fcm_options.link . Généralement, cela est défini sur une page de votre application Web :

https://fcm.googleapis.com//v1/projects/<YOUR-PROJECT-ID>/messages:send
Content-Type: application/json
Authorization: bearer <YOUR-ACCESS-TOKEN>

{
  "message": {
    "token": "eEz-Q2sG8nQ:APA91bHJQRT0JJ...",
    "notification": {
      "title": "Background Message Title",
      "body": "Background message body"
    },
    "webpush": {
      "fcm_options": {
        "link": "https://dummypage.com"
      }
    }
  }
}

Si la valeur du lien pointe vers une page déjà ouverte dans un onglet du navigateur, un clic sur la notification amène cet onglet au premier plan. Si la page n'est pas déjà ouverte, un clic de notification ouvre la page dans un nouvel onglet.

Étant donné que les messages de données ne prennent pas en charge fcm_options.link , il est recommandé d'ajouter une charge utile de notification à tous les messages de données. Vous pouvez également gérer les notifications à l’aide du service Worker.

Pour une explication de la différence entre les messages de notification et de données, voir Types de messages .

Définition des options de notification dans le service worker

Pour les messages de données, vous pouvez définir des options de notification dans le service Worker. Tout d’abord, initialisez votre application dans le service worker :

Web modular API

import { initializeApp } from "firebase/app";
import { getMessaging } from "firebase/messaging/sw";

// Initialize the Firebase app in the service worker by passing in
// your app's Firebase config object.
// https://firebase.google.com/docs/web/setup#config-object
const firebaseApp = initializeApp({
  apiKey: 'api-key',
  authDomain: 'project-id.firebaseapp.com',
  databaseURL: 'https://project-id.firebaseio.com',
  projectId: 'project-id',
  storageBucket: 'project-id.appspot.com',
  messagingSenderId: 'sender-id',
  appId: 'app-id',
  measurementId: 'G-measurement-id',
});

// Retrieve an instance of Firebase Messaging so that it can handle background
// messages.
const messaging = getMessaging(firebaseApp);

Web namespaced API

// Give the service worker access to Firebase Messaging.
// Note that you can only use Firebase Messaging here. Other Firebase libraries
// are not available in the service worker.
importScripts('https://www.gstatic.com/firebasejs/8.10.1/firebase-app.js');
importScripts('https://www.gstatic.com/firebasejs/8.10.1/firebase-messaging.js');

// Initialize the Firebase app in the service worker by passing in
// your app's Firebase config object.
// https://firebase.google.com/docs/web/setup#config-object
firebase.initializeApp({
  apiKey: 'api-key',
  authDomain: 'project-id.firebaseapp.com',
  databaseURL: 'https://project-id.firebaseio.com',
  projectId: 'project-id',
  storageBucket: 'project-id.appspot.com',
  messagingSenderId: 'sender-id',
  appId: 'app-id',
  measurementId: 'G-measurement-id',
});

// Retrieve an instance of Firebase Messaging so that it can handle background
// messages.
const messaging = firebase.messaging();

Pour définir les options, appelez onBackgroundMessage dans firebase-messaging-sw.js . Dans cet exemple, nous créons une notification avec des champs de titre, de corps et d'icône.

Web modular API

import { getMessaging } from "firebase/messaging/sw";
import { onBackgroundMessage } from "firebase/messaging/sw";

const messaging = getMessaging();
onBackgroundMessage(messaging, (payload) => {
  console.log('[firebase-messaging-sw.js] Received background message ', payload);
  // Customize notification here
  const notificationTitle = 'Background Message Title';
  const notificationOptions = {
    body: 'Background Message body.',
    icon: '/firebase-logo.png'
  };

  self.registration.showNotification(notificationTitle,
    notificationOptions);
});

Web namespaced API

messaging.onBackgroundMessage((payload) => {
  console.log(
    '[firebase-messaging-sw.js] Received background message ',
    payload
  );
  // Customize notification here
  const notificationTitle = 'Background Message Title';
  const notificationOptions = {
    body: 'Background Message body.',
    icon: '/firebase-logo.png'
  };

  self.registration.showNotification(notificationTitle, notificationOptions);
});

Bonnes pratiques pour les notifications

Si vous êtes familier avec la messagerie push pour le Web, vous avez peut-être déjà lu les grandes lignes décrivant ce qui constitue une bonne notification . Pour les développeurs qui envoient des notifications via FCM pour le Web, les considérations les plus importantes sont la précision et la pertinence. Voici quelques recommandations spécifiques pour que vos notifications restent précises et pertinentes :

  • Utilisez le champ d'icône pour envoyer une image significative. Dans de nombreux cas d’utilisation, il doit s’agir d’un logo d’entreprise ou d’application que vos utilisateurs reconnaissent immédiatement. Ou, pour une application de chat, il peut s'agir de l'image de profil de l'utilisateur expéditeur.
  • Utilisez le champ titre pour exprimer la nature précise du message. Par exemple, « Jimmy a répondu » transmet des informations plus précises que « Nouveau message ». N'utilisez pas cet espace précieux pour le nom de votre entreprise ou de votre application : utilisez l'icône à cet effet.
  • N'utilisez pas le titre ou le corps de la notification pour afficher le nom ou le domaine de votre site Web ; les notifications contiennent déjà votre nom de domaine.
  • Ajoutez fcm_options.link , généralement pour relier l'utilisateur à votre application Web et la mettre en évidence dans le navigateur. Dans les rares cas où toutes les informations que vous devez transmettre peuvent figurer dans la notification, vous n'aurez peut-être pas besoin d'un lien.