如何在Electron中实现跨平台带自定义音效的通知?
Electron跨平台自定义音效通知实现指南
一、你的代码问题根源
Electron原生Notification的sound属性仅支持macOS,Windows和Linux系统会直接忽略该参数,因此你的代码只能在Mac上生效,其他平台会播放系统默认音效(或无音效)。
二、跨平台通用实现方案(主进程/渲染进程)
通用思路是:将原生通知设为静音,单独用音频播放库控制自定义音效。这种方案稳定可控,不受系统API限制,也是行业通用的跨平台解决方案。
1. 主进程实现步骤
- 第一步:安装维护活跃的跨平台音频播放库(比如
play-sound,轻量且适配多系统) - 第二步:发送静音通知的同时,单独播放自定义音效
const { app, Notification } = require('electron'); const path = require('path'); const player = require('play-sound')(opts = {}); // 发送带自定义音效的通知 function sendCustomNotification(title, body) { // 1. 创建静音通知,避免系统默认音效干扰 const notification = new Notification({ title, body, silent: true }); // 2. 播放自定义音效 player.play(path.join(app.getAppPath(), 'assets/ping.mp3'), (err) => { if (err) console.error('音效播放失败:', err); }); // 3. 显示通知 notification.show(); } // 调用示例 sendCustomNotification('Example!', "Here's an example!");
2. 渲染进程实现步骤
渲染进程可直接使用Web Audio API播放音效,同时调用通知API(浏览器原生或Electron提供的):
// 渲染进程代码 async function showNotificationWithSound(title, body) { // 1. 播放自定义音效 try { const audio = new Audio('../assets/ping.mp3'); await audio.play(); } catch (err) { console.error('音效播放失败:', err); } // 2. 显示静音通知 new Notification(title, { body, silent: true }).show(); }
注意:渲染进程使用浏览器原生Notification时,需提前向用户申请通知权限。
三、Slack/Discord这类大型Electron应用的实现方式
它们的核心逻辑和上述方案一致:
- 完全放弃依赖原生通知的
sound属性,统一由应用自身控制音效播放 - 自研或基于成熟音频库封装音频管理模块,支持预加载资源、音量调节、多平台解码适配
- 部分应用会实现自定义通知窗口(而非完全依赖系统原生通知),配合音效打造更统一的跨平台体验
这种方案的优势是完全可控,不受系统API限制,能保证各平台用户体验一致。
四、Tauri是否更合适?
Tauri的通知系统同样依赖系统原生API,其Notification的sound属性也仅支持macOS自定义路径。不过Tauri可通过tauri-plugin-audio或Web Audio API实现音效播放,整体实现逻辑和Electron无本质区别。
如果你追求更小的包体积和更接近原生的性能,Tauri是不错的替代选择,但在自定义音效通知的实现上,和Electron的核心思路一致。
内容的提问来源于stack exchange,提问作者Cassidy
相关产品推荐
相关产品推荐

