JavaScript 使用node-notifier发送通知(Mac, Windows, Linux)

Posted by cl9000 on December 31, 2020

人生的价值,并不是用时间,而是用深度去衡量的。 ——<列夫·托尔斯泰>

介绍

通知是一种吸引用户使用应用的好方法,可以用来提供或征求反馈。在本教程中,我们将研究如何使用Node.jsnode-notifier 发送通知。

在Node JS中,Node-notifier是一个用于发送跨平台本机通知的库。
Node-notifier https://www.npmjs.com/package/node-notifier

使用node-notifier创建通知

首先,我们创建一个目录,并使用默认设置初始化一个 Node 项目:

1
2
3
4
$ mkdir node-native-notifications && cd node-native-notifications
$ npm init -y
$ npm install --save node-notifier
$ touch index.js

接下来,在 index.js 文件中,我们导入 node-notifier:

1
2
3
4
5
6
7
8
9
10
11
const notifier = require('node-notifier');

/// 有两种方法可以使用 `node-notifier` 创建和推送简单的通知。
// 将一个字符串传递给 `notify()` 函数:
notifier.notify('Message');

// 或者,也可以传递一个对象,并设置属性,如标题和消息:
notifier.notify({
title: 'My notification',
message: 'Hello, there!'
});

我们运行这段代码,看看通知的作用,终端执行:

1
$ node index.js

通知在我们的桌面屏幕上显示,我们可以看到推送的两条消息

自定义通知

除了标题和消息选项之外,您还可以设置要出现的图标,使用声音来添加通知声音或使用 wait 来等待用户操作,
默认情况下,soundwaitfalse

我们添加一个图标,它可以是任何图像文件,以及通知的声音。另外,我们也会等待用户执行一个动作:

1
2
3
4
5
6
7
8
9
10
11
12
13
const path = require('path');

notifier.notify({
title: 'Salutations!',
message: 'Hey there!',
icon: path.join(__dirname, 'icon.jpg'),
sound: true,
wait: true
},
function (err, response) {
console.log(response);
}
);

在上面的代码中,我们包含了 path 模块,以帮助我们获得文件的路径。我们还将一个回调函数传递给 notify()函数,并将响应或用户交互记录到控制台。

运行上面的代码,您将得到一个带有您选择的作为通知图标的图像的通知。根据您计算机的操作系统和版本,可能还会伴随着新通知的声音显示。

如果您单击按钮取消通知,则取消的字符串将被记录到控制台。如果没有与通知的交互,直到它消失,它显示超时。如果通知本身被单击,它将未定义地记录到控制台。

为不同平台定制选项

如前一节所述,由于用户操作系统使用的报告系统不同,发送的通知的行为可能会有所不同。

node-notification 尝试使用具有最佳用户体验的系统,但它更喜欢本地解决方案。它为每个平台提供决策流中定义的回退。
https://github.com/mikaelbr/node-notifier/blob/HEAD/DECISION_FLOW.md

但是,您可以为每个报告系统创建一个定制的报告程序,以控制您在应用程序中发送的通知的行为。有五个: Notification Center, Windows Toaster, Windows Balloons, Growl, and notify-send.

当使用 Windows Toaster 或通知发送通知时,await选项不适用,因为 Windows Toaster 总是等待,而通知发送不支持 await 选项。

sound 选项只能用于通知中心和 Windows Toaster通知。图标选项接受图像文件的绝对路径,并且不适用于 Windows Balloons

Growl

当其他报告器失败或无法用于该操作系统时,该报告器可以作为备用报告器。它构建在开源的Growly包上,并使用Growl实用程序发送消息来发送本地通知。

在你的代码中添加以下内容,为你的应用程序定制Growl报告:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
const fs = require('fs);
const Growl = require('node-notifier').Growl;
// Or
// const Growl = require('node-notifier/notifiers/growl');

let growlNotifier = new Growl({
name: 'Node'
host: 'localhost',
port: 23053
});

growlNotifier.notify({
title: 'Greetings',
message: 'Hello user!',
icon: fs.readFileSync(__dirname + '/icon.jpg'),
wait: false,

// Other growl options like sticky etc.
sticky: false,
label: undefined,
priority: undefined
});

在上面的代码中,我们创建了一个新的 Growl 实例,并设置了一些选项,比如它的名称、主机和将要运行它的端口。

接下来,我们使用常用选项调用 notify()方法。Growl向我们介绍了更多的选项,这些选项在这里被记录下来。

Windows Toaster

这是一个专门为Windows操作系统的记者,它支持通知自Windows 8和更新。

让我们使用 Windows Toaster 来推送一个通知:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const WindowsToaster = require('node-notifier').WindowsToaster;
// Or
// const WindowsToaster = require('node-notifier/notifiers/toaster');

let windowsToasterNotifier = new WindowsToaster({
withFallback: true
});

windowsToasterNotifier.notify({
title: "Windows Toaster Notification",
message: "This is a notification sent from the Windows Toaster Notifier",
icon: path.join(__dirname, 'icon.jpg'),
sound: "SMS",
},
function (error, response) {
console.log(response);
}
);

这里,我们正在实例化一个WindowsToaster实例,将 withFallback 参数设置为 true。如果这个通知不工作,它将回落到GrowlWindows Balloons

然后我们用常用的选项调用 .notify() 方法。

Windows Balloon

这是一个专门针对Windows 8以下所有Windows操作系统版本的记者。它使用任务栏气球来显示通知。要特别为这个报告器定制选项,您可以这样编写代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const WindowsBalloon = require('node-notifier').WindowsBalloon;
// Or
// const WindowsBallon = require('node-notifier/notifiers/windowsballon');

var windowsBalloonNotifier = new WindowsBalloon({
withFallback: true
});

windowsBalloonNotifier.notify({
title: "Windows Balloon Notification",
message: "This notification was sent using Windows Balloons.",
sound: true,
time: 1000,
wait: false,
type: 'warn'
},
function (error, response) {
console.log(response);
}
);

像往常一样,我们构造了一个通知器的实例,并将我们的选项传递给notify()函数。

在这里,我们可以指定以毫秒为单位的时间,之后通知将消失。我们不会等待用户对通知执行操作,所以wait设置为false

同时,我们将通知type设置为warnsound设置为true。这将以警告的形式通知用户。我们也可以使用infoerror,这取决于你想表达什么。

通知中心

这个是为macOS系统发送通知。它需要 macOS版本10.8以上。对于早期版本,它将使用咆哮作为后备。如果没有安装Growl,回调函数会返回一个错误。

要设置通知中心报告器,您可以编写如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
const NotificationCenter = require('node-notifier').NotificationCenter;
// Or
// const NotificationCenter = require('node-notifier/notifiers/notificationcenter');

let notificationCenterNotifier = new NotificationCenter({
withFallback: true
});

notificationCenterNotifier.notify({
title: "Notification Center Notifications",
subtitle: "For macOS > 10.8",
message: "This is a notification sent using Notification Center",
sound: 'Frog',
icon: path.join(__dirname, 'icon.jpg'),
contentImage: path.join(__dirname, 'content_image.jpg'),
open: undefined,
wait: false,
},
function (error, response, metadata) {
console.log(response, metadata);
}
);

sound参数包含一系列数值,如Basso, Blow, Bottle等。如果设置为true,默认值是Bottle。或者,你可以设置你喜欢的特定声音。

Notify-send

用于在基于 Linux的系统上定制要发送的通知。可以如下图所示使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
const NotifySend = require('node-notifier').NotifySend;
// Or
// const NotifySend = require('node-notifier/notifiers/notifysend');

let notifySendNotifier = new NotifySend();

notifySendNotifier.notify({
title: 'Notify-send Notification',
message: 'This notification was sent using the notify-send reporter',
icon: __dirname + '/icon.jpg',
wait: true,
timeout: 5
});

结论

通知为用户提供了一种与应用程序交互的方式,本地通知是那些显示在用户桌面而不是显示在浏览器中的通知。

在本文中,我们介绍了如何使用node-notifier向用户发送通知。

参考

关注【公众号】,了解更多。



支付宝打赏 微信打赏

赞赏一下 坚持原创技术分享,您的支持将鼓励我继续创作!