Электрон с узлом-уведомителем отображает окна 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.

  1. в package.json
 "build": {
 "appId": "your.custom.app.id",
 }
  1. в main.js
app.setAppUserModelId("your.custom.app.id");
Другие вопросы по тегам