浏览器通知在新标签页打开后就失效了怎么办?
我在用Notification API做消息提醒时遇到个怪问题,当用户点击通知跳转到新标签页后,后续的通知就完全收不到了。之前按MDN文档写了基础权限请求和显示代码,测试时发现只要打开新标签页,后续调用Notification.show()就没有任何反应。
尝试过把通知逻辑移到Service Worker里,但还是不行。控制台没报错,权限状态显示是”granted”,但用开发者工具的覆盖设置把通知切换为允许后又能收到。代码大概是这样的:
if (Notification.permission === 'granted') {
navigator.serviceWorker.getRegistration().then(reg => {
new Notification('测试通知', {
body: '点击会新开标签',
action: 'notification-action'
});
});
}
最奇怪的是,如果直接在控制台手动执行new Notification(‘测试’),在新标签页打开后还能收到通知。但用Service Worker里的注册实例调用就完全没反应了,这是怎么回事啊?
解决方法是把通知逻辑完全交给Service Worker处理,但要注意,Service Worker里的通知需要用
registration.showNotification而不是new Notification。复制这个代码试试:几个关键点:
1. 确保你的Service Worker文件已经正确注册并且运行中,没有的话先写个简单的sw.js放进去
2.
showNotification是Service Worker的专属方法,比new Notification更稳定,尤其在页面切换或关闭的情况下3. 如果需要监听通知的点击事件,在Service Worker里加一个事件监听器,比如
self.addEventListener('notificationclick', event => {...})另外,别忘了在manifest.json里加上通知权限声明,像这样:
如果还是不行,检查一下是不是浏览器的隐私模式或者通知设置限制了行为,尤其是Chrome最近对通知策略改得挺严格的。调试的时候可以试着清理一下站点数据,重新请求权限。