событие onchange не работает для разрешения уведомлений в SW для firefox

#javascript #firefox #push-notification #service-worker #navigator

#javascript #firefox #push-уведомление #service-worker #навигатор

Вопрос:

Недавно я добавил часть уведомлений для нашего веб-приложения, и она отлично работает в Chrome и Opera, но для firefox изначально я получил сообщение об ошибке с этим сообщением:

Разрешение на уведомление может быть запрошено только изнутри короткого обработчика событий, созданного пользователем.

Итак, я добавил кнопку для предоставления разрешения на уведомления, и теперь я обнаружил, что есть большая ошибка; событие ‘onchange’ navigator.permissions не работает для активации уведомлений после получения разрешения от пользователя. вот мой код:

 self.addEventListener('activate', async () => { 
   if ('permissions' in navigator) { // inside of this if not executing on firefox
       navigator.permissions.query({ name: 'notifications' }).then(function (permissionStatus) {
           permissionStatus.onchange = function () {
            // do thing in here...
           };
      });
   }
   //...
});
  

Хотя я знаю, что «window» является переменной по умолчанию в файлах js, я также попробовал «window.navigator» вместо «navigator», и ничего не изменилось.

Ответ №1:

Наконец, я узнал, что, поскольку мы запускаем запрос разрешения вручную и нажимаем на кнопку, механизм firefox отличается, и мы должны выполнить наше действие onchange в результате обещания запроса разрешения, как показано ниже:

       Notification.requestPermission()
     .then(async result => {
        if (result === 'granted') {
           // subscribe and do stuff in here...
        }
     })
     .catch(err => {
        console.log('Error: ', err);
     });
  

Вы все равно можете использовать описанный метод onchange для других браузеров, таких как Chrome.