You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 05:00:53