Cách hoạt động của thông báo

Cho đến nay, chúng ta đã xem xét các tuỳ chọn thay đổi giao diện hình ảnh của thông báo. Ngoài ra, còn có các tuỳ chọn thay đổi hành vi của thông báo.

Theo mặc định, việc gọi showNotification() chỉ bằng các tuỳ chọn hình ảnh sẽ có các hành vi sau:

  • Việc nhấp vào thông báo đó sẽ không có tác dụng gì.
  • Các thông báo mới sẽ lần lượt xuất hiện. Trình duyệt sẽ không thu gọn thông báo theo bất kỳ cách nào.
  • Nền tảng có thể phát âm thanh hoặc rung thiết bị của người dùng (tuỳ thuộc vào nền tảng).
  • Trên một số nền tảng, thông báo sẽ biến mất sau một khoảng thời gian ngắn trong khi những nền tảng khác vẫn hiển thị thông báo trừ phi người dùng tương tác với thông báo đó. (Ví dụ: so sánh thông báo của bạn trên Android và máy tính để bàn.)

Trong phần này, chúng ta sẽ xem cách chúng ta có thể thay đổi các hành vi mặc định này bằng cách sử dụng riêng các tuỳ chọn. Các giải pháp này tương đối dễ triển khai và tận dụng.

Sự kiện nhấp chuột vào thông báo

Khi người dùng nhấp vào một thông báo, hành vi mặc định là không có gì xảy ra. Thao tác này thậm chí còn không đóng hoặc xoá thông báo.

Phương pháp phổ biến cho lượt nhấp vào thông báo là để lượt nhấp đó đóng và thực hiện một số logic khác (ví dụ: mở một cửa sổ hoặc thực hiện một lệnh gọi API nào đó đến ứng dụng).

Để thực hiện việc này, bạn cần thêm trình nghe sự kiện 'notificationclick' vào trình chạy dịch vụ. Lệnh này sẽ được gọi bất cứ khi nào bạn nhấp vào thông báo.

self.addEventListener('notificationclick', (event) => {
  const clickedNotification = event.notification;
  clickedNotification.close();

  // Do something as the result of the notification click
  const promiseChain = doSomething();
  event.waitUntil(promiseChain);
});

Như bạn có thể thấy trong ví dụ này, bạn có thể truy cập vào thông báo mà người dùng nhấp vào dưới dạng event.notification. Từ đó, bạn có thể truy cập vào các thuộc tính và phương thức của thông báo. Trong trường hợp này, bạn sẽ gọi phương thức close() và thực hiện thêm công việc.

Thao tác

Các thao tác cho phép bạn tạo thêm một mức độ tương tác khác với người dùng thay vì chỉ nhấp vào thông báo.

Nút

Trong phần trước, bạn đã xem cách xác định các nút hành động khi gọi showNotification():

const title = 'Actions Notification';

const options = {
  actions: [
    {
      action: 'coffee-action',
      title: 'Coffee',
      type: 'button',
      icon: '/images/demos/action-1-128x128.png',
    },
    {
      action: 'doughnut-action',
      type: 'button',
      title: 'Doughnut',
      icon: '/images/demos/action-2-128x128.png',
    },
    {
      action: 'gramophone-action',
      type: 'button',
      title: 'Gramophone',
      icon: '/images/demos/action-3-128x128.png',
    },
    {
      action: 'atom-action',
      type: 'button',
      title: 'Atom',
      icon: '/images/demos/action-4-128x128.png',
    },
  ],
};

registration.showNotification(title, options);

Nếu người dùng nhấp vào một nút hành động, hãy kiểm tra giá trị event.action trong sự kiện noticationclick để biết nút hành động nào được nhấp vào.

event.action sẽ chứa giá trị action được đặt trong các tuỳ chọn. Trong ví dụ trên, giá trị event.action sẽ là một trong những giá trị sau: 'coffee-action', 'doughnut-action', 'gramophone-action' hoặc 'atom-action'.

Bằng cách này, chúng tôi sẽ phát hiện các lượt nhấp vào thông báo hoặc lượt nhấp vào hành động như sau:

self.addEventListener('notificationclick', (event) => {
  if (!event.action) {
    // Was a normal notification click
    console.log('Notification Click.');
    return;
  }

  switch (event.action) {
    case 'coffee-action':
      console.log("User ❤️️'s coffee.");
      break;
    case 'doughnut-action':
      console.log("User ❤️️'s doughnuts.");
      break;
    case 'gramophone-action':
      console.log("User ❤️️'s music.");
      break;
    case 'atom-action':
      console.log("User ❤️️'s science.");
      break;
    default:
      console.log(`Unknown action clicked: '${event.action}'`);
      break;
  }
});

Câu trả lời cùng dòng

Ngoài ra, trong phần trước, bạn đã biết cách thêm câu trả lời nội tuyến cho thông báo:

const title = 'Poll';

const options = {
  body: 'Do you like this photo?',
  image: '/images/demos/cat-image.jpg',
  icon: '/images/demos/icon-512x512.png',
  badge: '/images/demos/badge-128x128.png',
  actions: [
    {
      action: 'yes',
      type: 'button',
      title: '👍 Yes',
    },
    {
      action: 'no',
      type: 'text',
      title: '👎 No (explain why)',
      placeholder: 'Type your explanation here',
    },
  ],
};

registration.showNotification(title, options);

event.reply sẽ chứa giá trị do người dùng nhập vào trường nhập dữ liệu:

self.addEventListener('notificationclick', (event) => {
  const reply = event.reply;

  // Do something with the user's reply
  const promiseChain = doSomething(reply);
  event.waitUntil(promiseChain);
});

Gắn thẻ

Tuỳ chọn tag về cơ bản là một mã nhận dạng chuỗi "nhóm" các thông báo lại với nhau, giúp bạn dễ dàng xác định cách nhiều thông báo hiển thị cho người dùng. Cách dễ nhất để giải thích bằng ví dụ.

Hãy hiển thị một thông báo và gắn thẻ cho thông báo đó là 'message-group-1'. Chúng tôi sẽ hiển thị thông báo có mã sau:

const title = 'Notification 1 of 3';

const options = {
  body: "With 'tag' of 'message-group-1'",
  tag: 'message-group-1',
};

registration.showNotification(title, options);

Thao tác này sẽ hiển thị thông báo đầu tiên của chúng ta.

Thông báo đầu tiên có thẻ của nhóm tin nhắn 1.

Hãy hiển thị thông báo thứ hai bằng thẻ mới là 'message-group-2' như sau:

const title = 'Notification 2 of 3';

const options = {
  body: "With 'tag' of 'message-group-2'",
  tag: 'message-group-2',
};

registration.showNotification(title, options);

Thao tác này sẽ hiển thị thông báo thứ hai cho người dùng.

Hai thông báo trong đó thẻ thứ hai của nhóm thông báo 2.

Bây giờ, hãy hiển thị thông báo thứ ba nhưng sử dụng lại thẻ đầu tiên của 'message-group-1'. Thao tác này sẽ đóng thông báo đầu tiên và thay thế bằng thông báo mới.

const title = 'Notification 3 of 3';

const options = {
  body: "With 'tag' of 'message-group-1'",
  tag: 'message-group-1',
};

registration.showNotification(title, options);

Bây giờ, chúng ta có hai thông báo, mặc dù showNotification() được gọi ba lần.

Hai thông báo trong đó thông báo đầu tiên được thay thế bằng một thông báo thứ ba.

Tuỳ chọn tag chỉ đơn giản là một cách nhóm các thông báo sao cho mọi thông báo cũ đang hiển thị sẽ bị đóng nếu có cùng thẻ với thông báo mới.

Một điều tinh tế khi sử dụng tag là khi thay thế một thông báo, ứng dụng sẽ không phát âm thanh hoặc rung.

Đây là lúc lựa chọn renotify phát huy tác dụng.

Thông báo lại

Điều này chủ yếu áp dụng cho các thiết bị di động tại thời điểm viết bài. Khi bạn đặt tuỳ chọn này, các thông báo mới sẽ rung và phát âm thanh hệ thống.

Có những trường hợp bạn muốn nhận một thông báo thay thế để thông báo cho người dùng thay vì tự động cập nhật. Ứng dụng nhắn tin là một ví dụ điển hình. Trong trường hợp này, bạn nên đặt tagrenotify thành true.

const title = 'Notification 2 of 2';

const options = {
  tag: 'renotify',
  renotify: true,
};

registration.showNotification(title, options);

Im lặng

Tuỳ chọn này cho phép bạn hiển thị một thông báo mới nhưng ngăn hành vi mặc định là rung, âm thanh và bật màn hình của thiết bị.

Đây là chế độ lý tưởng nếu người dùng không cần người dùng chú ý ngay đến thông báo của bạn.

const title = 'Silent Notification';

const options = {
  silent: true,
};

registration.showNotification(title, options);

Cần có sự tương tác

Chrome trên máy tính sẽ hiển thị các thông báo trong một khoảng thời gian đã đặt trước khi ẩn các thông báo đó. Chrome trên Android không có hành vi này. Thông báo được hiển thị cho đến khi người dùng tương tác với thông báo.

Để buộc một thông báo tiếp tục hiển thị cho đến khi người dùng tương tác với thông báo đó, hãy thêm tuỳ chọn requireInteraction. Thao tác này sẽ hiển thị thông báo cho đến khi người dùng đóng hoặc nhấp vào thông báo của bạn.

const title = 'Require Interaction Notification';

const options = {
  requireInteraction: true,
};

registration.showNotification(title, options);

Hãy cân nhắc khi sử dụng lựa chọn này. Việc hiện thông báo và buộc người dùng dừng những gì họ đang thực hiện để đóng thông báo có thể gây khó chịu.

Trong phần tiếp theo, chúng ta sẽ xem xét một số mẫu phổ biến được sử dụng trên web để quản lý thông báo và thực hiện hành động như mở trang khi có người nhấp vào thông báo.

Điểm đến tiếp theo

Lớp học lập trình