我遇到了一个问题,Notification.requestPermission
无法从我的ServiceWorker
处理程序中触发。
有趣的是,如果尝试从浏览器控制台使用Notification.requestPermission
可以正常工作,并且我在Chrome浏览器窗口的顶部看到了通知请求。
作者:Notification.requestPermission().then(res => console.log(res))
。但是同样会在从ServiceWorker
文件执行期间向我抛出错误,例如:
未捕获的TypeError:self.Notification.requestPermission不是函数
那么,也许有人知道错在哪里?我已经在SoW上看到了这些帖子:
但是他们不能解决我的问题...
我在其中使用通知的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}`)
}
})
答案 0 :(得分:2)
在这里寻找答案的人很容易-您应Notification.requestPermission
阶段结束之前仅运行DOMContentLoaded
。
否则,由于完成页面的资源加载,浏览器将不允许您请求此权限。
答案 1 :(得分:1)
除了可接受的答案外,也如注释中提到的@ user706420一样,如果唯一的用例仅是获得许可的状态,而不是使用Notification.requestPermission()
(可能已从主线程用于请求许可的情况)用户首次访问您的应用时。
一个人可以在显示通知之前使用Notification.permission
从服务工作者内部检查权限的当前状态,因为用户可以随时更改权限。
这是一个代码段:
self.addEventListener('push', function(event) {
if(Notification.permission === 'granted'){
self.registration.showNotification()
}