Windows - Электрон использует протокол (с параметрами), чтобы «сделать что-то» в текущем активном электронном приложении.

1

ОБНОВЛЕНО НИЖЕ

Примечание. Это приложение предназначено только для окон, поэтому оно исключает "открытый URL" и т.д.

У меня есть протокол, работающий для моего приложения, и он успешно открывает электронное приложение, однако то, что я ищу, так это, если приложение открыто, и пользователь нажимает на ссылку протокола с параметрами (my-app://go/to/это/раздел), он откроет текущее приложение и запустит функцию, чтобы перейти к ссылке.

То, что на самом деле происходит на минуту, - это приложение открывает другую версию самого себя и не передает аргументы.

У меня есть функция setAsDefaultProtocolClient в моем приложении app.js, чтобы попытаться поймать любые экземпляры протокола, но это, похоже, не работает.

const {remote} = window.require('electron');    
remote.app.setAsDefaultProtocolClient( 'my-app' );

У меня также есть функция makeSingleInstance в моем основном процессе, позволяющая только один экземпляр приложения запускаться за один раз, но, похоже, он не посылает аргументы, которые я передаю с протоколом при закрытии второго клиента.

// Make sure there is only 1 instance of the app running at a time
const isSecondInstance = app.makeSingleInstance((commandLine, workingDirectory) => {
    if (mainWindow) {
        if (mainWindow.isMinimized()) mainWindow.restore();
        mainWindow.focus();
    }
});
// If this is a second instance of the app close it
if (isSecondInstance) {
    app.quit();
}

ОБНОВИТЬ:

Теперь у меня появилось второе окно с протоколом к исходному экземпляру приложения, но я не могу зарегистрировать аргументы.

Всякий раз, когда я регистрирую process.argv и использую 'my-app://section/29, это только каталог каталога установки и не имеет никаких параметров.

Я добавил следующее к makeSingleInstance

if (process.platform == 'win32') {
    deeplinkingUrl = process;
    // Keep only command line / deep linked arguments
    logEverywhere( process );
}

Здесь logEverywhere только для справки:

function logEverywhere(s) {
    console.log(s);
    if (mainWindow && mainWindow.webContents) {
        mainWindow.webContents.executeJavaScript('console.log("${s}")');
    }
}
Теги:
electron

1 ответ

1
Лучший ответ

В функции makeSingleInstance имеется параметр commandLine который содержит массив аргументов командной строки второго экземпляра, который будет включать URL-адрес протокола.

Таким образом, вы должны написать что-то вроде этого:

var isSecondInstance = exports.app.makeSingleInstance(function (commandLine, workingDirectory) {
    if (mainWindow) {
        if (mainWindow.isMinimized()) mainWindow.restore();
        mainWindow.focus();
        var protocolLink = commandLine[1];
        // Run function to go to link.
    }
});

if (isSecondInstance) {
    app.quit();
}

Если переменная protocolLink является ссылкой, на которую пользователь нажал.

  • 0
    Спасибо, это дало мне еще ххх
  • 0
    Добро пожаловать @Rafty всегда рады помочь

Ещё вопросы

Сообщество Overcoder
Наверх
Меню