Windows 10中chrome.notifications.update仅更新一次的原因及解决方法
问题原因分析
这个问题的核心是Windows 10系统下Chrome对requireInteraction: true的持久化通知更新逻辑存在兼容性差异。当你设置requireInteraction: true让通知保持显示时,Windows的Toast通知系统对仅修改title和message的更新请求处理非常严格,后续的chrome.notifications.update()调用可能不会触发UI刷新——而MacOS的通知系统对这类更新的处理更宽松,所以能正常工作。
你可以查看后台日志里的updated? ${updated}输出,大概率后续的更新请求会返回false,这也能佐证Chrome在Windows下没能成功触发通知更新。
解决方案
这里提供两种可行的修复方案,你可以根据体验需求选择:
方案一:添加可变属性触发Windows通知更新
Windows的Toast通知系统需要看到通知属性有实质性变化才会刷新UI。我们可以在每次更新时添加一个随时间变化的属性(比如时间戳),让系统识别这是一个有效的更新请求。
修改displayNotification函数里的notificationOptions,新增contextMessage字段:
const notificationOptions = { type: 'basic', iconUrl: 'icon.png', // required title: message, message, silent: true, requireInteraction: true, // 添加随时间变化的属性,强制Windows刷新通知 contextMessage: Date.now().toString() }
这个字段会显示在通知的下方(不影响主要内容),但每次更新时它的值都是新的,Windows会因此触发通知UI的更新,这样你的倒计时就能正常走完所有步骤了。
方案二:替换为“清除旧通知+创建新通知”的逻辑
如果方案一不符合你的需求,也可以放弃更新同一个通知,改为每次清除旧通知后创建新的。虽然会有轻微的闪烁,但能确保内容在Windows下正常显示:
修改点击事件的处理逻辑:
chrome.browserAction.onClicked.addListener(() => { chrome.notifications.getPermissionLevel(async (permissionLevel) => { console.log(`permissionLevel: ${permissionLevel}`) if (permissionLevel === 'granted') { let currentId; // 显示3秒倒计时 currentId = await displayNotification('Recording in 3...'); await waitForMs(1000); await chrome.notifications.clear(currentId); currentId = await displayNotification('Recording in 2...'); await waitForMs(1000); await chrome.notifications.clear(currentId); currentId = await displayNotification('Recording in 1...'); await waitForMs(1000); await chrome.notifications.clear(currentId); // 显示录制提示并自动消失 await displayNotification('Now recording!', undefined, 3000); } }) })
额外建议
- 确保你的Chrome是最新版本:旧版本的Chrome在Windows下对通知更新的支持可能存在bug,升级到最新版可能直接解决问题。
- 检查Windows通知设置:确认Chrome的通知权限是完全开启的,没有被设置为“静默通知”或者限制通知内容。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

