Сервисный работник уведомляет о том, что событие щелчка не фокусируется или не открывает мой веб-сайт
Я использую 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.