Электрон с узлом-уведомителем отображает окна 10 уведомлений
Я пытаюсь сделать простое приложение, которое должно отображать уведомление при нажатии кнопки. Проблема в том, что уведомление не показывается, а выводятся console.logs. Должно ли уведомление работать в режиме разработки? (имеется в виду просто бег electron .
и мне не нужно собирать и устанавливать приложение)
ОС Windows:
- Издание: Windows 10 Home
- Версия: 1709
- Сложение:16299.98
- ПРИМЕЧАНИЕ: тост включен (баннер, центр действий) под
System->Notification & Actions
Код:
// main.js
const { app, BrowserWindow, ipcMain, Notification } = require("electron");
const path = require("path");
const url = require("url");
let win;
function createWindow() {
// Create the browser window.
win = new BrowserWindow({ width: 800, height: 600 });
// and load the index.html of the app.
win.loadURL(
url.format({
pathname: path.join(__dirname, "index.html"),
protocol: "file:",
slashes: true
})
);
// Open the DevTools.
// win.webContents.openDevTools()
// Emitted when the window is closed.
win.on("closed", () => {
// Dereference the window object, usually you would store windows
// in an array if your app supports multi windows, this is the time
// when you should delete the corresponding element.
win = null;
});
}
const appId = "elite-notifier";
app.setAppUserModelId(appId);
app.on("ready", createWindow);
console.log("notifying");
ipcMain.on("notify", () => {
console.log("notified");
const WindowsToaster = require("node-notifier").WindowsToaster;
const notifier = new WindowsToaster({
withFallback: false
});
notifier.notify(
{
title: "My awesome title",
message: "Hello from node, Mr. User!",
sound: true, // Only Notification Center or Windows Toasters
wait: false // Wait with callback, until user action is taken against notification
},
function(err, response) {
// Response is response from notification
console.log("responded...");
}
);
});
// index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Hello World!</title>
</head>
<body>
<h1>Notifier!</h1>
<button type="button" id="notify">Click here to trigger a notification!</button>
<script type="text/javascript">
const { ipcRenderer } = require('electron');
const button = document.getElementById('notify');
console.log('BUTTON: ', button)
button.addEventListener('click', function(event) {
console.log('clicked...');
ipcRenderer.send('notify')
});
</script>
</body>
</html>
2 ответа
У меня это работает сейчас, спасибо всем людям здесь:) https://github.com/mikaelbr/node-notifier/issues/144
На основе anthonyraymond
комментарий, вам нужно иметь свое приложение INSTALLED
в вашей машине Windows с appId. Вы можете настроитьappId
в вашемpackage.json
как это.
{
"name": "myapp",
"version": "1.0.0",
"description": "test",
"main": "main.js",
"build": {
"appId": "com.myapp.id"
}
}
appId
не нужно иметь этоjava/android
формат, мое приложение просто есть appId
из elite-notifier
,
Тогда вы можете передать appId
при вызовеnotify
функция уведомителя.
notifier.notify(
{
appName: "com.myapp.id", <-- yes, the key here is appName :)
title: "Hello",
message: "Hello world!",
wait: true
},
function(err, response) {
// Response is response from notification
console.log("responded...");
}
);
После установки это будет работать даже в режиме разработки (запустивelectron .
команда) при условии, что вы не измените appId
вашего приложения после установки, так как будет установлено несоответствие между установленным и разрабатываемой версией приложения.
Я тоже много чего пробовал, но иногда работает или нет.
Наконец-то я нашел способ. Это хорошо работает не только для "npm run dev", но и для сборки пакетов.
- использовать Уведомление в процессе рендеринга.
зарегистрировать идентификатор приложения на package.json
"build": {"appId": "мой идентификатор приложения", ...
вызовите app.setAppUserModelId("мой идентификатор приложения") в главном процессе ( https://electronjs.org/docs/api/app)
Здесь идентификатор приложения может быть любым типом строки.
Вам не нужно использовать IPC и отправлять уведомления от основного процесса, это поддерживается процессом рендеринга с использованием API уведомлений HTML5.
let myNotification = new Notification('Title', {
body: 'Lorem Ipsum Dolor Sit Amet'
})
myNotification.onclick = () => {
console.log('Notification clicked')
}
Эта ошибка не требует какой-либо настройки, все, что вам нужно сделать, это перейти к настройкам и включить уведомление, потому что в некоторых случаях на вашем компьютере вы просто отключили уведомления.
System Setting ->Notification & Actions
Затем включите уведомление, нажав переключатель (проблема решена)
Вы можете сделать это, у меня это работает даже на windows 10.
- в package.json
"build": {
"appId": "your.custom.app.id",
}
- в main.js
app.setAppUserModelId("your.custom.app.id");