React PWA中使用Notification API点击按钮没反应怎么办?
我在React组件里用Notification API做消息提醒,按教程写了请求权限和发送通知的函数,但点击按钮完全没反应。手机真机测试也没弹出通知,控制台也没报错。代码检查了好几遍,哪出问题了?
这是我的代码片段:
handleNotify = () => {
Notification.requestPermission().then(permission => {
if (permission === 'granted') {
new Notification('测试通知', {
body: '这是一条测试消息',
icon: '/icon.png'
});
}
});
};
尝试过在service worker里注册也试过直接调用,但两种方式都不行。手机设置里没有看到通知权限被禁用,难道是PWA安装状态影响?或者需要额外配置manifest字段?
你在 handleNotify 里先 requestPermission() 再发通知,看似合理,但实际上 requestPermission() 返回的是一个 Promise,new Notification() 是在异步回调里执行的,这时候浏览器已经不认为这是“用户点击直接触发”的行为了,静默失败。
正确的做法是先把权限请求做掉,不要每次点按钮都请求一次。改一下流程:
然后你的按钮只负责发通知:
重点来了:requestPermission() 要在用户有交互(比如点了个“开启通知”提示)之后调,不然 Chrome 会直接拒绝并锁定该域名。你可以加个引导按钮专门用来触发权限申请,等用户点了再调 requestPermission()。
另外确保你的项目跑在 HTTPS 或 localhost 下,否则 Notification API 直接不可用——PWA 真机测试也得保证是安全上下文。
最后检查下 /icon.png 是否存在,404 不影响通知弹出,但会有 warning。建议 icon 给个绝对路径
/static/icon.png或 public 下的相对路径。这样改完,手机真机也能弹出来。别折腾 service worker 发通知了,那是推送场景(push event),你现在只是本地通知,不需要那么复杂。