Nhận thông báo trong ứng dụng JavaScript

Hành vi của thông báo sẽ khác nhau tuỳ thuộc vào việc trang ở nền trước (có tiêu điểm) hay ở nền sau, ẩn sau các thẻ khác hoặc đóng hoàn toàn. Trong mọi trường hợp, trang phải xử lý lệnh gọi lại onMessage, nhưng trong các trường hợp ở chế độ nền, bạn cũng có thể cần xử lý onBackgroundMessage hoặc định cấu hình thông báo hiển thị để cho phép người dùng đưa ứng dụng web của bạn vào nền trước.

Trạng thái ứng dụng Thông báo Dữ liệu Cả hai
Màu nổi onMessage onMessage onMessage
Nền (trình chạy dịch vụ) onBackgroundMessage (tự động hiển thị thông báo hiển thị) onBackgroundMessage onBackgroundMessage (tự động hiển thị thông báo hiển thị)

Mẫu nhanh JavaScript minh hoạ tất cả mã cần thiết để nhận thông báo.

Xử lý thông báo khi ứng dụng web của bạn chạy ở nền trước

Để nhận được sự kiện onMessage, ứng dụng của bạn phải xác định trình chạy dịch vụ thông báo Firebase trong firebase-messaging-sw.js. Ngoài ra, bạn có thể cung cấp một worker dịch vụ hiện có cho SDK thông qua getToken(): Promise<string>.

Web

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

// 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.
// Replace 10.13.2 with latest version of the Firebase JS SDK.
importScripts('https://www.gstatic.com/firebasejs/10.13.2/firebase-app-compat.js');
importScripts('https://www.gstatic.com/firebasejs/10.13.2/firebase-messaging-compat.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();

Khi ứng dụng của bạn chạy ở nền trước (người dùng đang xem trang web), bạn có thể nhận được dữ liệu và gói dữ liệu thông báo ngay trong trang.

Web

// 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

// 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);
  // ...
});

Xử lý thông báo khi ứng dụng web của bạn chạy trong nền

Tất cả thông báo nhận được trong khi ứng dụng đang chạy ở chế độ nền sẽ kích hoạt thông báo hiển thị trong trình duyệt. Bạn có thể chỉ định các tuỳ chọn cho thông báo này, chẳng hạn như tiêu đề hoặc hành động nhấp, trong yêu cầu gửi từ máy chủ ứng dụng hoặc sử dụng logic worker dịch vụ trên ứng dụng.

Thiết lập các tuỳ chọn thông báo trong yêu cầu gửi

Đối với thông báo được gửi từ máy chủ ứng dụng, API JavaScript FCM hỗ trợ khoá fcm_options.link. Thông thường, bạn sẽ đặt giá trị này thành một trang trong ứng dụng 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"
      }
    }
  }
}

Nếu giá trị đường liên kết trỏ đến một trang đã mở trong thẻ trình duyệt, thì một lượt nhấp vào thông báo sẽ đưa thẻ đó vào nền trước. Nếu trang chưa mở, một lượt nhấp vào thông báo sẽ mở trang trong một thẻ mới.

Vì thông báo dữ liệu không hỗ trợ fcm_options.link, nên bạn nên thêm tải trọng thông báo vào tất cả thông báo dữ liệu. Ngoài ra, bạn có thể xử lý thông báo bằng trình chạy dịch vụ.

Để biết nội dung giải thích về sự khác biệt giữa thông báo và tin nhắn dữ liệu, hãy xem phần Các loại thông báo.

Đặt các tuỳ chọn thông báo trong trình chạy dịch vụ

Đối với thông báo dữ liệu, bạn có thể đặt các tuỳ chọn thông báo trong worker dịch vụ. Trước tiên, hãy khởi chạy ứng dụng của bạn trong worker dịch vụ:

Web

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

// 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.
// Replace 10.13.2 with latest version of the Firebase JS SDK.
importScripts('https://www.gstatic.com/firebasejs/10.13.2/firebase-app-compat.js');
importScripts('https://www.gstatic.com/firebasejs/10.13.2/firebase-messaging-compat.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();

Để đặt các tuỳ chọn, hãy gọi onBackgroundMessage trong firebase-messaging-sw.js. Trong ví dụ này, chúng ta tạo một thông báo có các trường tiêu đề, nội dung và biểu tượng.

Web

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

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);
});

Các phương pháp hay nhất về thông báo

Nếu đã quen với tính năng nhắn tin đẩy cho web, có thể bạn đã đọc các nguyên tắc chung về những yếu tố tạo nên một thông báo hiệu quả. Đối với nhà phát triển gửi thông báo qua FCM cho Web, điều quan trọng nhất cần cân nhắc là độ chính xác và mức độ liên quan. Dưới đây là một số đề xuất cụ thể để đảm bảo thông báo của bạn chính xác và phù hợp:

  • Sử dụng trường biểu tượng để gửi hình ảnh có ý nghĩa. Đối với nhiều trường hợp sử dụng, đây phải là biểu trưng của công ty hoặc ứng dụng mà người dùng có thể nhận ra ngay. Hoặc đối với ứng dụng nhắn tin, đó có thể là ảnh hồ sơ của người dùng gửi.
  • Sử dụng trường tiêu đề để thể hiện bản chất chính xác của thư. Ví dụ: "Jimmy trả lời" truyền tải thông tin chính xác hơn so với "Tin nhắn mới". Đừng sử dụng khoảng trống quý giá này cho tên công ty hoặc ứng dụng của bạn — hãy sử dụng biểu tượng cho mục đích đó.
  • Đừng sử dụng tiêu đề hoặc nội dung thông báo để hiển thị tên trang web hoặc miền của bạn; thông báo đã chứa tên miền của bạn.
  • Thêm fcm_options.link, thường là để liên kết người dùng trở lại ứng dụng web của bạn và đưa ứng dụng đó vào tiêu điểm trong trình duyệt. Trong một số ít trường hợp khi tất cả thông tin bạn cần truyền tải đều vừa với thông báo, thì bạn có thể không cần đường liên kết.