notification api 不支持声音,因规范未定义sound字段;只能在用户交互后用audio播放模拟提示音,需预加载、复用实例并控制音量。

网页里没法直接设置系统级通知声音,浏览器不给这个权限;能做的只有在用户主动交互(比如点击)后,用 Audio 播放一段音频,模拟提示音效果。
为什么 Notification API 播不了声音
Web Notifications 规范(Notification API)只支持标题、正文、图标和动作,sound 字段从未被标准接纳,Chrome、Firefox、Safari 全都不认。你看到的某些“带声音的通知”,其实是自己叠加了 new Audio() 播放逻辑。
- 调用
Notification.requestPermission()后弹出的通知,无论怎么加sound: 'a.mp3'字段,浏览器都会静默忽略 - 即使在
service worker里触发推送(push事件),也仅支持vibrate、icon、badge等字段,依然没有sound - 部分安卓 PWA 可通过
webappmanifest.json的sound字段影响系统推送音,但这是设备/厂商定制行为,iOS 完全不支持,不能当作通用方案
手动播放提示音的正确时机和写法
必须等用户完成一次**可信的用户手势**(如 click、touchend、keydown)后,才能调用 audio.play()。否则 Chrome 会抛 DOMException: play() failed because the user didn't interact with the document first。
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
- 不要在
notification.onclick回调里直接new Audio('bell.mp3').play()—— 这时已脱离用户手势上下文,大概率失败 - 推荐做法:在用户点击按钮时,同时触发通知 + 预加载并播放音频,例如:
button.addEventListener('click', () => { new Notification('新消息'); const audio = new Audio('/sounds/chime.mp3'); audio.play().catch(e => console.warn('Audio play failed:', e)); }); - 音频格式优先选
.mp3或.ogg,避免.wav(体积大、兼容性差);注意路径要可跨域访问,不能是file://协议下本地路径
如何让提示音更自然、不突兀
直接 audio.play() 容易卡顿或无声,尤其在移动端。得做几件事:
- 提前创建并复用
Audio实例,避免每次新建对象(iOS Safari 对频繁新建Audio很敏感) - 设
audio.volume = 0.3控制音量,别依赖用户系统音量调节 - 加
audio.preload = 'auto'和audio.load()(在页面初始化时),确保首次播放不卡 - 对重复通知,可加节流:用
setTimeout记录上次播放时间,1.5 秒内不再触发
真正可靠的“通知声音”,本质是「用户操作 → 播放音频」+「单独发通知」两件事的配合。别指望一个 API 调用就搞定声音,那不是浏览器的设计逻辑,而是你得亲手把音频和交互链路串起来。最常被忽略的是音频实例的复用和预加载——没做这两点,80% 的静音问题都出在这儿。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










