Сервисный работник уведомляет о том, что событие щелчка не фокусируется или не открывает мой веб-сайт

Я использую push-уведомление FCM на своем веб-сайте и хочу, чтобы пользователь мог зайти на мой сайт, когда он или она нажмет на push-уведомление. Обратите внимание, что пользователь может находиться в другом приложении или на другой вкладке браузера, и я хочу, чтобы, когда пользователь получал уведомление fcm, пользователь мог зайти на мой сайт, щелкнув уведомление в браузере Firefox. По этой причине я использовал событие messagesclick, которая доступна в сервисном сервисе. Код, который я использовал, это:

self.addEventListener('notificationclick', event => {
  console.log('On notification click: ', event.notification.tag);
  event.notification.close();

  // This looks to see if the current is already open and
  // focuses if it is
  event.waitUntil(
    clients
      .matchAll({
        type: 'window'
      })
      .then(clientList => {
        for (let i = 0; i < clientList.length; i++) {
          const client = clientList[i];
          if (client.url === '/' && 'focus' in client) return client.focus();
        }
        if (clients.openWindow) return clients.openWindow('/');
      })
  );
});

Он не открывается или фокусируется на вкладке моего сайта. Для отладки кода я напечатал переменную clientList и это массив нулевой длины.

Ошибка, которую я получаю в браузере, заключается в следующем

On notification click: 
InvalidStateError: An attempt was made to use an object that is not, or is no longer, usable firebase-messaging-sw.js:92

Вышеуказанная ошибка относится к этой строке кода:

event.waitUntil(

ОС: Mac Firefox:63.0.3. Реагирует:16.2.0.

2 ответа

Переместить ваш notificationclick обработчик ДО вашей строки кода с messaging = firebase.messaging();, FCM JS SDK устанавливает собственный глобальный notificationclick обработчик и его e.waitUntil() вызову удается (каким-то образом) сломать объект события Firefox. Если вы сначала установите глобальный обработчик, то сначала он будет вызван, и он действительно будет работать. Однако, это, вероятно, сломает обработчик FCM каким-то неясным способом.

Это, IMO, ошибка в самом Firefox в отношении сервисных работников, а не FCM, но FCM, безусловно, усугубляет проблему.

Соответствующий:

https://github.com/firebase/quickstart-js/issues/282 (та же ошибка FCM)

https://bugzilla.mozilla.org/show_bug.cgi?id=1468935 (та же ошибка FCM + Firefox, плохое исправление)

https://bugzilla.mozilla.org/show_bug.cgi?id=1313096 (команда разработчиков Firefox не имеет возможности проверить обратный вызов в своем наборе тестов Service Worker, что делает эту часть Firefox готовой к ошибкам)

https://bugzilla.mozilla.org/show_bug.cgi?id=1489800 (та же ошибка браузера, другой продукт)

Если цель заключается в открытии определенного URL-адреса при нажатии на уведомление, возможно, существует более простой способ. Вы можете отправить поле "click_action" в полезную нагрузку уведомления FCM.

Ваша полезная нагрузка будет выглядеть примерно так:

  "notification" : {
    "body" : "Sample body",
    "title" : "Sample title",
    "click_action": "http://google.com"
  }

При нажатии на уведомление в этом примере открывается сайт google.com.

Другие вопросы по тегам