用户第一次点允许通知时选了拒绝,后面再点按钮毫无反应,Notification.requestPermission() 直接返回 denied,控制台没有报错。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,权限一旦进入 denied 状态,同源下再调用 requestPermission 不会弹窗,只会立刻返回当前值。浏览器把这个决定记在站点设置里,代码层面改不回来。

「通知权限 denied」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。

if (Notification.permission === 'denied') {
  showTip('请在浏览器站点设置中允许通知');
} else {
  await Notification.requestPermission();
}

权限不要一口气开到最大,先加到够用再往上试,范围小才好收。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。

具体做法是,调用前先读 Notification.permission,是 denied 就不要调接口;页面改成引导文案,告诉用户去浏览器站点设置里手动改;在设置页放一个检测按钮,用户改完回来能立刻看到状态。

最后用这个标准收尾,权限为 denied 时点按钮出现引导文案,手工在站点设置里改成允许后,按钮能正常订阅成功。

作者 9823189