Алексей
А devtools
Алексей
Ctrl shift i Вроде так открывается
Yupi
А devtools
Перезагружается постоянно
Алексей
Ничего не выводит туда?
Yupi
page layout may be unexpected due to Quirks Mode
Алексей
Может быть ошибка в хтмл файле Скинь код хтмл
Yupi
Я наверное скоро лысым стану от этого электрона
Yupi
какой же я тупой в <base href="./"> ./ забыл вставить
Yupi
Удивительно что если юзать просто так работает, а когда собираю нет
Александр
Доброго времени суток. Уважаемые разработчики, кто-нибудь сталкивался с такой проблемой: приложение электрон открыто, но не могу развернуть окно? Висит на панели задач и ни в какую
Ratatata
Добрый день. Подскажите пожалуста возможно ли переназначить закрытие приложения на клавишу escape?
Unknown
Добрый день. Подскажите пожалуста возможно ли переназначить закрытие приложения на клавишу escape?
повесить листенер на киап с кодом эскейпа и слать в мэйн на метод на закрытие
Hov.
решил. если у кого будет подобная проблема - пишите
Сразу напиши сюда решение, чтоб люди поиском находили ответы, если что
Nikolay Dimitriev
Приложение angular. Пытаюсь настроить автообновление. Для теста разместил по пути https://myservrurl.com/2.0.1/myapp.exe следующую версию приложения. Текущая, на которой тестирую автообновление - 2.0.0. Долго читал доку и понял, что вот такой вариант должен вполне работать. Но собираю приложение, устанавливаю, запускаю приложение и... ничего не происходит. Если запустить просто ng build && electron . , то в консоли спустя 30 секунд (интервал, по которому запускается autoUpdater.checkForUpdates()) пишет There was a problem updating the application Error: Can not find Squirrel at AutoUpdater.checkForUpdates В чём проблема и куда копать? const {app, BrowserWindow, autoUpdater, dialog} = require('electron'); const log = require('electron-log'); // Подключение модуля логирования const server = 'https://myservrurl.com/'; const url = `${server}/2.0.1/`; autoUpdater.setFeedURL({ url }); // интервал для регулярной проверки обновлений setInterval(() => { autoUpdater.checkForUpdates(); }, 30 * 1000); // Проверка каждые 30 секунд autoUpdater.on('update-downloaded', (event, releaseNotes, releaseName) => { const dialogOpts = { type: 'info', buttons: ['Restart', 'Later'], title: 'Application Update', message: process.platform === 'win32' ? releaseNotes : releaseName, detail: 'A new version has been downloaded. Restart the application to apply the updates.' }; dialog.showMessageBox(dialogOpts).then((returnValue) => { if (returnValue.response === 0) autoUpdater.quitAndInstall() }) }); autoUpdater.on('error', (message) => { console.error('There was a problem updating the application') console.error(message) }); // каталог для логов, где будут храниться журналы приложения log.transports.file.file = 'logfile.log'; log.transports.file.format = '{h}:{i}:{s} {text}'; // формат логов let appWindow; app.commandLine.appendSwitch('disable-http-cache'); function createWindow() { // log.info('Creating appWindow...'); appWindow = new BrowserWindow({ width: 1600, height: 800, // alwaysOnTop: true, // должно ли окно всегда оставаться поверх других окон. frame: false, // Убирает стандартный фрейм с кнопками управления окном }); // log.info('Loading dist/index.html...'); appWindow.loadFile('dist/index.html'); appWindow.on('closed', function () { appWindow = null; }); // Открываем окно в полноэкранном режиме appWindow.setFullScreen(true); // проверка, что приложение не запустилось и в открывшемся окне просто белый экран if (appWindow) { let reloaded = false; appWindow.webContents.on('did-finish-load', () => { if (reloaded) { return; } appWindow.webContents.executeJavaScript(` document.body.innerText.trim().length > 0 `).then(bodyLoaded => { // если вдруг что-то пошло не так и программа в итоге // не запустилась - то она перезапускется принудительно if (!bodyLoaded) { reloaded = true; appWindow.loadFile('dist/index.html'); } }); }); } } // Проверка на наличие другого экземпляра приложения const gotTheLock = app.requestSingleInstanceLock(); if (!gotTheLock) { // Если другой экземпляр приложения уже активен, то можно отобразить сообщение об ошибке // dialog.showErrorBox('Ошибка', 'Приложение уже запущено.'); app.quit(); } else { // Если текущий экземпляр является первым, создаётся окно приложения app.on('second-instance', (event, commandLine, workingDirectory) => { if (appWindow) { // log.info('appWindow show'); appWindow.show(); } }); app.whenReady().then(() => { // log.info('createWindow'); createWindow(); }); }
P X N C H X R
Приложение angular. Пытаюсь настроить автообновление. Для теста разместил по пути https://myservrurl.com/2.0.1/myapp.exe следующую версию приложения. Текущая, на которой тестирую автообновление - 2.0.0. Долго читал доку и понял, что вот такой вариант должен вполне работать. Но собираю приложение, устанавливаю, запускаю приложение и... ничего не происходит. Если запустить просто ng build && electron . , то в консоли спустя 30 секунд (интервал, по которому запускается autoUpdater.checkForUpdates()) пишет There was a problem updating the application Error: Can not find Squirrel at AutoUpdater.checkForUpdates В чём проблема и куда копать? const {app, BrowserWindow, autoUpdater, dialog} = require('electron'); const log = require('electron-log'); // Подключение модуля логирования const server = 'https://myservrurl.com/'; const url = `${server}/2.0.1/`; autoUpdater.setFeedURL({ url }); // интервал для регулярной проверки обновлений setInterval(() => { autoUpdater.checkForUpdates(); }, 30 * 1000); // Проверка каждые 30 секунд autoUpdater.on('update-downloaded', (event, releaseNotes, releaseName) => { const dialogOpts = { type: 'info', buttons: ['Restart', 'Later'], title: 'Application Update', message: process.platform === 'win32' ? releaseNotes : releaseName, detail: 'A new version has been downloaded. Restart the application to apply the updates.' }; dialog.showMessageBox(dialogOpts).then((returnValue) => { if (returnValue.response === 0) autoUpdater.quitAndInstall() }) }); autoUpdater.on('error', (message) => { console.error('There was a problem updating the application') console.error(message) }); // каталог для логов, где будут храниться журналы приложения log.transports.file.file = 'logfile.log'; log.transports.file.format = '{h}:{i}:{s} {text}'; // формат логов let appWindow; app.commandLine.appendSwitch('disable-http-cache'); function createWindow() { // log.info('Creating appWindow...'); appWindow = new BrowserWindow({ width: 1600, height: 800, // alwaysOnTop: true, // должно ли окно всегда оставаться поверх других окон. frame: false, // Убирает стандартный фрейм с кнопками управления окном }); // log.info('Loading dist/index.html...'); appWindow.loadFile('dist/index.html'); appWindow.on('closed', function () { appWindow = null; }); // Открываем окно в полноэкранном режиме appWindow.setFullScreen(true); // проверка, что приложение не запустилось и в открывшемся окне просто белый экран if (appWindow) { let reloaded = false; appWindow.webContents.on('did-finish-load', () => { if (reloaded) { return; } appWindow.webContents.executeJavaScript(` document.body.innerText.trim().length > 0 `).then(bodyLoaded => { // если вдруг что-то пошло не так и программа в итоге // не запустилась - то она перезапускется принудительно if (!bodyLoaded) { reloaded = true; appWindow.loadFile('dist/index.html'); } }); }); } } // Проверка на наличие другого экземпляра приложения const gotTheLock = app.requestSingleInstanceLock(); if (!gotTheLock) { // Если другой экземпляр приложения уже активен, то можно отобразить сообщение об ошибке // dialog.showErrorBox('Ошибка', 'Приложение уже запущено.'); app.quit(); } else { // Если текущий экземпляр является первым, создаётся окно приложения app.on('second-instance', (event, commandLine, workingDirectory) => { if (appWindow) { // log.info('appWindow show'); appWindow.show(); } }); app.whenReady().then(() => { // log.info('createWindow'); createWindow(); }); }
https://github.com/electron/electron/issues/4535
Nikolay Dimitriev
https://github.com/electron/electron/issues/4535
То есть, как я понял, нужно отказаться от nsis в пользу Sqirrel? У меня есть файл electron-builder.json, в котором используется nsis, но, честно говоря, пока не до конца ясно как изменить на Sqirrel и что конкретно для этого нужно cделать? { "appId": "com.example.app", "productName": "myapp", "directories": { "output": "./inst" }, "win": { "target": "nsis", "icon": "icon.ico", "publisherName": "CN=\"MyApp, Inc.\", O=\"MyApp, Inc.\"" }, "nsis": { "oneClick": false, "perMachine": true, "allowToChangeInstallationDirectory": true } }
P X N C H X R
https://github.com/electron/electron/issues/17722#issuecomment-1334597242
Николай
Ребят, всем привет! Подскажите пожалуйста. Перенес React приложение на электрон. Необходим доступ к localStorage и кукам. Когда запускаю electron приложение в dev моде, всё отлично, при билде доступ к хранилищам теряется. Как это исправить?
nikolay
что вы подразумеваете под словом "теряется"? после установки сбрасывается содержимое localStorage?
Yupi
Привет. У кого нибудь бывало что меняешь иконку приложения, собираешь билд, вроде она применяется, но иконка на рабочем столе остается прежней. Как такое фиксить?
Nikolay Dimitriev
Привет. У кого нибудь бывало что меняешь иконку приложения, собираешь билд, вроде она применяется, но иконка на рабочем столе остается прежней. Как такое фиксить?
Тоже так. В верхней панели приложения эта иконка применяется, а вот к ярлыку на рабочем столе нет (приложение ангуляр, собираю в exe): const iconPath = path.join(__dirname, 'icon.ico'); function createWindow() { win = new BrowserWindow({ width: 1280, height: 720, backgroundColor: '#ffffff', //Trocar caminho para corresponder ao ícone da aplicação icon: iconPath }); win.setMenu(MenuPrincipal); win.webContents.openDevTools(); //Trocar caminho para corresponder ao index.html da aplicação win.loadFile('dist/index.html'); win.on('closed', function () { win = null; }); }
🅰️nimeCoder
Ваш exe к icon окна отношения вообще не имеет ни малейшего
Nikolay Dimitriev
То есть, как я понял, нужно отказаться от nsis в пользу Sqirrel? У меня есть файл electron-builder.json, в котором используется nsis, но, честно говоря, пока не до конца ясно как изменить на Sqirrel и что конкретно для этого нужно cделать? { "appId": "com.example.app", "productName": "myapp", "directories": { "output": "./inst" }, "win": { "target": "nsis", "icon": "icon.ico", "publisherName": "CN=\"MyApp, Inc.\", O=\"MyApp, Inc.\"" }, "nsis": { "oneClick": false, "perMachine": true, "allowToChangeInstallationDirectory": true } }
Удалось настроить автообновление. В целом всё работает, новые версии устанавливаются, если разместить нужные файлы версии по пути https://myserverurl.ru/releases/ , но если разместить в release более старую версию, чем уже установлена, то в логах пишется "warn: CheckForUpdateImpl: hwhat, local version is greater than remote version", не смотря на то, что у меня проставлено autoUpdater.allowDowngrade = true; Нужно ли что-то ещё, чтобы разрешать установку более старых версий? В документации явно описано, что это должно разрешать установку более старых версий: /** * Whether to allow version downgrade (when a user from the beta channel wants to go back to the stable channel). * * Taken in account only if channel differs (pre-release version component in terms of semantic versioning). * * @default false */ allowDowngrade: boolean; Вот код обновления в app.js: // Определение глобальных переменных для URL и интервала let updateURL = null; let updateInterval = null; let isDownloading = false; // Функция для установки URL и интервала для проверки обновлений function setUpdateURL() { // разрешаем установку более старых версий autoUpdater.allowDowngrade = true; // Устанавливаем URL для проверки обновлений const server = 'https://myserverurl.ru/'; updateURL = `${server}releases/`; // Устанавливаем интервал для регулярной проверки обновлений updateInterval = setInterval(() => { if (!isDownloading) { // Просто проверяем наличие обновлений, без дополнительных проверок autoUpdater.checkForUpdates(); } }, 30 * 1000); // Проверка каждые 30 секунд // Устанавливаем URL для autoUpdater autoUpdater.setFeedURL({ url: updateURL }); } // Обработка начала загрузки autoUpdater.on('update-downloading', () => { isDownloading = true; }); // Обработка завершения загрузки autoUpdater.on('update-downloaded', () => { isDownloading = false; });
ALΣX
Привет, может кто подсказать, как синхронизировать оповещения и пользовательские звуки? Я решил в renderer процессе показывать уведомления через HTML Notifications API в сочетании с Howler.js. Все работает хорошо, пока уведомлений не становится слишком много и они не помещаются в системный стек. Как оказалось, событие show, к которому я прикрепил воспроизведение звуков, обрабатывается сразу после создания уведомления, а не когда оно фактически показано пользователю. Теперь получается, что звуки воспроизводятся до того, как само уведомление показывается. С нативным Notification модулем (для main процесса) та же байда...
_dimon_chick_
а тебе правда нужно решать эту проблему, я имею ввиду, часто ли у пользователя переполнен стек уведов ?
_dimon_chick_
да и обычно же сначала идет звук уведомления, а потом как ты уже написал оно появляется на экране
ALΣX
а тебе правда нужно решать эту проблему, я имею ввиду, часто ли у пользователя переполнен стек уведов ?
да, есть высокая вероятность. У нас приложение для печати и может быть несколько заданий за раз отправляться и для каждого нужно показать уведомление со статусом: удалось напечатать или нет. И проблема как раз в том, что если уведомлений много и для них не создавать какуюто-то кастомную очередь, тогда все звуки воспроизводятся до того, как показывается хотя бы 3-4 уведомление, т.е. нет синхронна вообще никакого. Пробывал писать логику с кастомной очередю и задержкой на 3с, но все же хочется какое-то более красивое решение и чтобы после меня никто не ломал голову, что и для чего.
_dimon_chick_
нельзя показ сделать промисом ? что бы после него воспроизводить звук ?
ALΣX
нельзя показ сделать промисом ? что бы после него воспроизводить звук ?
хм, хорошая идея) спасибо, сейчас перепишу и протестирую)
_dimon_chick_
отпиши потом получилось или нет, самому интересно))
Сергей
Всем привет. Можете подсказать не совсем по электрону? Начинаю изучать всю кухню (js-elctron-react) и не могу понять, почему не перерисовывается компонент. Если в useEffect не обновлять переменную content, то установленный вначале через useState контент отрисовывается, но как только я выставляю контент в useEffect, страница пустая.
eden
я оттуда пришел уже, там вообще молчат по этому вопросу)
выходные - день оффтопа, там все заняты другими делами)
Сергей
как часто тебе нужно переисовывать его ? я имею ввижу если у тебя это идет 1 раз, после обновлений settings, то попробуй отрисовывать страницу после смены content
При изменении настроек в другом окне. Проблему решил, но не понял из-за чего. Я reactsplit вынес в return, а в content передаю только массив rows, и оно начало работать
Сергей
Кинул бы скрины, но сейчас не за компом
_dimon_chick_
Мб из за того что Setting это объект, ты его не так менял и useEffect не замечал изменения ?
Сергей
Нет, сеттингс точно менялись, узнавал это путём вывода в консоль
_dimon_chick_
Так как это сложный тип данных, нужно полностью перезаписывать стейт, что бы поменять его (с полным глубоким копированием)
Сергей
Вот и я о том же
_dimon_chick_
Да уж, этот реакт та еще штука 😅
Сергей
Эх.. Как же было всё просто и понятно в с#
eden
помогите, пожалуйста. Падает нотаризация приложения с такой ошибкой: Error: HTTP status code: 403. A required agreement is missing or has expired. This request requires an in-effect agreement that has not been signed or has expired. Ensure your team has signed the necessary legal agreements and that they are not expired. Захожу на сайт девелопера эпл, там ничего нового не появляется (раньше появлялось вроде). Как принять все соглашения?
eden
Новое соглашение видно только аккаунт холдеру
я единственный разработчик, не компания
10N37
я единственный разработчик, не компания
На какую линку заходишь? До этого точно не принимал?
eden
На какую линку заходишь? До этого точно не принимал?
https://developer.apple.com/account принимал давно последний раз
10N37
https://developer.apple.com/account принимал давно последний раз
А что в секции Agreements по этой линке у тебя?
10N37
Тоже самое, возможно проблема в чем-то другом
eden
Тоже самое, возможно проблема в чем-то другом
хмм, ладно, спасибо, буду копать
eden
кажется подписалось. Я только сегодня оплатил аккаунт, видимо не сразу подцепилась оплата
Степан
Всем привет. Можно ли через электрон получить координаты(геопозицию) местоположения устройства, с которого производится работа приложения?
Степан
А если как-то через Яндекс пробивать, то тогда без участия электрона, правильно?
Стас
Через что ты ее пользуешь не имеет значения
Сергей
Ни у кого не завалялось туториала как сделать приложение с реактом без TS? А то я тут навертел чего-то с вебпаком и пока не разобрался что происходит) Сбилдил приложение, но идут ошибки пл доступу ws/0.0.0.0./ws
Стас
Ну или не убирай, технически оно тебе ничем не мешает
Сергей
А ещё вопросик, я могу как-то сбилдить под линукс на винде? Или мне тащить проект на линукс и там билдить?
🅰️nimeCoder
А ещё вопросик, я могу как-то сбилдить под линукс на винде? Или мне тащить проект на линукс и там билдить?
если делать постоянно - можно на гитхаб экшенс (1000 часов на паблик репы), там и под мак можно, но проще в докере том же, жрать правда будет на винде неплохо
Anonym Squad
Доброго времени суток, подскажите пожалуйста. У меня сейчас есть наработка, приложения на электрон+реакт+экспресс(да я извращенец😅) Задумался о том, что бы экспресс заменить на nest.js(просто потому что удобно), можете подсказать как это сделать? Или процедура ни чем не отличается с экспрессом? Пысы- экспресс , у меня переведен в ts
Anonym Squad
А причём тут электрон?
Мне тяжело, внутри электрон запустить этот самый нест
Anonym Squad
Я с экспрессом то с танцами и бубнами мучился.
Степан
Падажжи а зачем тебе нест на клиент-сайде...
🅰️nimeCoder
Ну так, отличий то нет, что на простой ноде, что в электроне. Ну в электроне доп апи есть, вот и все. Nest это purejs нативок нет, в чем проблема
🅰️nimeCoder
Падажжи а зачем тебе нест на клиент-сайде...
Не ну проблемы то нет, я бы спросил зачем ему express на клиент сайде
Anonym Squad
Падажжи а зачем тебе нест на клиент-сайде...
Я веб кодер, мне понятно общение фронта с бэком. Проще говоря, приложение это тот же сайт, только приложение.
🅰️nimeCoder
Тыж на нем пишешь бэк и тебе на нем легко. В электроне ничего не меняется.