从ServiceWorker执行文件中未定义Notification.requestPermission。铬

时间:2019-01-04 12:59:50

标签: javascript google-chrome browser service-worker

我遇到了一个问题,Notification.requestPermission无法从我的ServiceWorker处理程序中触发。

有趣的是,如果尝试从浏览器控制台使用Notification.requestPermission可以正常工作,并且我在Chrome浏览器窗口的顶部看到了通知请求。

作者:Notification.requestPermission().then(res => console.log(res))。但是同样会在从ServiceWorker文件执行期间向我抛出错误,例如:

  

未捕获的TypeError:self.Notification.requestPermission不是函数

那么,也许有人知道错在哪里?我已经在SoW上看到了这些帖子:

  1. Webkit notifications requestPermission function doesn't work

  2. Desktop notifications allowing not working on chrome

但是他们不能解决我的问题...

我在其中使用通知的SW push部分代码:

  self.addEventListener('push', function(event) {
    console.log(self.Notification, Notification.requestPermission)
    self.Notification.requestPermission().then(res => console.log(res))

    if (Notification.permission === 'denied') {
      console.log('Permission wasn\'t granted. Allow a retry.');
     return;
    }

    if (Notification.permission === 'default') {
      console.log('The permission request was dismissed.');
      return;
    }

    console.log('The permission request is granted!');

    try {
      event.waitUntil(
        self.registration.showNotification(event && event.data && event.data.text() || 'Some Notification Here!')
      );
    } catch (e) {
      throw new Error(`Error in SW: ${e}`)
    }
  })

2 个答案:

答案 0 :(得分:2)

在这里寻找答案的人很容易-您应Notification.requestPermission阶段结束之前仅运行DOMContentLoaded

否则,由于完成页面的资源加载,浏览器将不允许您请求此权限。

答案 1 :(得分:1)

除了可接受的答案外,也如注释中提到的@ user706420一样,如果唯一的用例仅是获得许可的状态,而不是使用Notification.requestPermission()(可能已从主线程用于请求许可的情况)用户首次访问您的应用时。

一个人可以在显示通知之前使用Notification.permission从服务工作者内部检查权限的当前状态,因为用户可以随时更改权限。

这是一个代码段:

self.addEventListener('push', function(event) {
  if(Notification.permission === 'granted'){
     self.registration.showNotification()
  }