人人都会AI编程

11.2 系统通知:Notification 通知、交互通知、行为回调

更新时间:2026-07-11

在很多桌面应用中,系统通知是与用户保持连接的最轻量手段。无论是聊天工具的新消息提醒、下载完成的提示,还是日程到期的告警,使用操作系统原生的通知样式能让用户感到应用真正融入了工作流。Electron 提供了两套调用系统通知的方法:主进程的 Notification 模块和渲染进程的 Web Notification API。推荐统一使用主进程方案,因为它更可控,且支持交互按钮。

11.2.1 发送一条基础通知

在主进程中创建并显示一条通知只需要几行代码。利用 Notification 构造器传入标题、正文和可选图标,然后调用 .show() 即可:

const { Notification } = require('electron');

function showBasicNotification() {
  const notification = new Notification({
    title: '导出完成',
    body: '你的项目报告已成功导出为 PDF。',
    icon: path.join(__dirname, 'assets/icon.png'), // 仅 macOS 有效
  });
  notification.show();
}

这条通知会立即出现在操作系统的通知中心。Windows 上它会显示在右下角,macOS 上则出现在右侧边缘并归入通知中心。由于是在主进程执行,你可以在任何需要的地方触发——菜单事件、IPC 响应、定时任务等。

11.2.2 添加交互按钮 (actions)

单纯的文字提醒有时不够用,用户往往希望在不打开应用的情况下直接执行一些简单操作。Electron 的 Notification 支持通过 actions 数组定义按钮,每个按钮有一个文本标签和类型标识。

function showInteractiveNotification() {
  const notification = new Notification({
    title: '收到新消息',
    body: '张明:会议资料发你了,确认一下?',
    actions: [
      { type: 'button', text: '快速回复' },
      { type: 'button', text: '标记已读' },
    ],
    closeButtonText: '忽略', // macOS 上自定义关闭按钮文本
  });
  notification.show();
}

平台差异提示:交互按钮的呈现方式在不同系统上有明显区别。macOS 允许显示一个或多个操作按钮,而且支持“内联回复”样式(但 Electron 目前不直接提供文本输入型 action)。Windows 10/11 的通知区域也可以显示按钮,但样式受系统版本和通知设置影响,部分情况下可能只显示一个操作。如果你需要保证体验一致,应该在发出通知前用 process.platform 判断系统,尽量避免依赖跨平台完全相同的按钮行为。

11.2.3 响应用户行为:事件回调

按钮定义好后,我们必须知道用户点击了哪一个。Notification 实例可以监听多个事件:

  • click:用户点击了通知主体(非按钮区域)。
  • action:用户点击了某个操作按钮,回调中会携带被点击按钮的索引。
  • close:通知被关闭(用户主动关闭或超时消失)。
  • failed:通知显示失败(例如系统通知被禁用)。

典型的事件绑定模式如下:

const { Notification } = require('electron');

const notification = new Notification({
  title: '备份提醒',
  body: '距离上次备份已经过去了 7 天。',
  actions: [
    { type: 'button', text: '立即备份' },
    { type: 'button', text: '稍后再说' },
  ],
});

notification.on('click', () => {
  // 用户点击了通知正文,一般理解为打开主窗口
  const mainWindow = BrowserWindow.getAllWindows()[0];
  if (mainWindow) {
    mainWindow.show();
    mainWindow.focus();
  }
});

notification.on('action', (event, index) => {
  // index 对应 actions 数组的顺序
  if (index === 0) {
    // 触发立即备份逻辑
    startBackup();
  } else if (index === 1) {
    // 设置一个稍后提醒定时器
    scheduleBackupReminder(60 * 60 * 1000); // 1 小时后再次提醒
  }
});

notification.on('close', () => {
  console.log('通知已关闭');
});

notification.show();

对于只有简单需求的小型工具,可以把 click 事件的回调直接当作“用户被通知吸引、希望查看详情”的入口,用来唤醒或弹出主窗口。而 action 回调则更适合执行轻量级任务,避免用户再次打开应用才能完成高频操作。

11.2.4 实际开发中的注意事项

  1. 权限与策略

绝大多数现代操作系统都允许用户按应用管理通知权限。请确保在应用首次启动时用温和的方式请求用户允许通知,不要弹窗强行索要。macOS 上需要在 Info.plist 中声明用途字符串,或通过 Electron Builder 的配置自动添加。

  1. 通知数量与频率

不要滥用通知轰炸用户。高频率的通知应合并为摘要,或提供“暂缓提醒”的选项。一条接一条弹出很容易导致用户直接关闭应用的通知权限,得不偿失。

  1. 图标大小

通知图标在不同平台上尺寸要求不同。macOS 推荐使用 44x44 以上、带有透明背景的 PNG;Windows 则用应用本身的图标。图标的模糊或裁切会降低通知的专业感,建议提前测试并准备多分辨率资源。

  1. 静默模式与勿扰状态

用户可能开启了 macOS 的“勿扰模式”或 Windows 的“专注助手”,此时通知仍会出现在通知中心但不会弹窗。这是系统行为,应用无需干预。如果业务上必须确保用户看到,考虑配合主窗口闪烁或系统托盘图标变化作为补充提醒。

  1. 从渲染进程触发

如果业务代码在渲染进程中,应该通过 IPC 向主进程发送消息,由主进程统一创建 Notification。这样既符合安全模型(主进程负责系统交互),也方便集中管理所有通知的生命周期。

一条好的系统通知应该像一位体贴的助手:在不打扰的前提下,把重要的信息送到眼前,并给用户一个立即处理的快捷方式。通过 Notification 的交互按钮和事件回调,你可以让这个助手真正做到“有来有回”,而不仅仅是简单的一行文字提醒。