Как запустить мое электронное приложение с веб-сайта

У нас есть электронное криптографическое приложение, которое подписывает транзакции (среди прочего).

Мы хотим, чтобы у других веб-сайтов была возможность иметь кнопку, открывающую это электронное приложение, предварительно заполненную некоторыми параметрами (информацией о транзакции).

поток:

  1. пользователь нажимает "совершить транзакцию" на some-crypto-site.com
  2. электронное приложение открывается с предварительно заполненными параметрами
  3. пользователь нажимает кнопку «подписать транзакцию» в электронном приложении
  4. электронное приложение делает вещи за кулисами
  5. электронное приложение закрывается и отправляет сообщение на some-crypto-site.com

Это можно сделать во время выполнения или во время установки.

Что пробовал (linux, chrome)

вызов app.setAsDefaultProtocolClient с кодом эту суть, которая по сути:

app.setAsDefaultProtocolClient("my-app")

Но после того, как я поместил my-app://foo?bar=baz в браузер Chrome, я получаю следующее всплывающее окно, и нажатие open-xdg ничего не делает (кроме закрытия всплывающего окна)

введите описание изображения здесь

Я заглянул в

  1. Электронный протокол API, который, кажется, обрабатывает только протоколы внутри приложения
  2. в качестве пути к файлу webtorrent. идти, я просто не знаю, как это сделать.

Может быть, есть способ сделать это во время установки с помощью электронного компоновщика?

Заранее спасибо за помощь, я понятия не имею, как действовать здесь!

Ресурсы, которые могут быть полезны

  1. репозиторий github с примером окна mac +
  2. комментарий github для Linux
  3. комментарий github для linux 2
  4. SO-ответ для всех трех ОС
  5. Ответ окон SO
  6. пакет npm для регистрации Windows
  7. Ответ SO mac
  8. SO linux answer
  9. microsoft docs для windows
  10. статья о Windows
  11. комментарий github для Windows
  12. комментарий github для Mac
  13. info.plst для Mac
  14. старый репо для Mac и выиграть

person goldylucks    schedule 29.11.2018    source источник
comment
вызовите app.setAsDefaultProtocolClient("my-app"), затем откройте его с помощью my-app://foo?bar=baz, в результате вызовите ваш / path / electronics.exe my-app: // foo? bar = baz. Первым аргументом delectron.exe будет путь к приложению, поэтому он не работает.   -  person hiitiger    schedule 30.11.2018
comment
@hiitiger Спасибо за комментарий, я не понимаю, что вы говорите. Вы можете уточнить?   -  person goldylucks    schedule 02.12.2018
comment
Здравствуйте, я не уверен, действительно ли вы можете открыть приложение Electron из Chrome, но вы можете отправлять ему вещи, если оно уже открыто. Это нормально?   -  person Joshua    schedule 04.12.2018


Ответы (1)


Поскольку это может иметь отношение к тому, что я делаю на работе, я решил попробовать. Я тестировал это только на OSX!

Я просмотрел документацию для app.setAsDefaultProtocolClient, и там написано следующее:

Примечание. В macOS вы можете регистрировать только протоколы, добавленные в info.plist вашего приложения, которые нельзя изменить во время выполнения. Однако вы можете изменить файл с помощью простого текстового редактора или сценария во время сборки. Подробную информацию см. В документации Apple.

Эти протоколы можно определить при упаковке вашего приложения с electron-builder. См. build:

{
  "name": "foobar",
  "version": "1.0.0",
  "main": "main.js",
  "scripts": {
    "start": "electron .",
    "dist": "electron-builder"
  },
  "devDependencies": {
    "electron": "^3.0.7",
    "electron-builder": "^20.38.2"
  },
  "dependencies": {},
  "build": {
    "appId": "foobar.id",
    "mac": {
      "category": "foo.bar.category"
    },
    "protocols": {
      "name": "foobar-protocol",
      "schemes": [
        "foobar"
      ]
    }
  }
}

В вашем основном потоке:

const {app, BrowserWindow} = require('electron');

let mainWindow;

function createWindow () {
  mainWindow = new BrowserWindow({width: 800, height: 600})
  mainWindow.loadFile('index.html');
}

app.on('ready', createWindow);

var link;

// This will catch clicks on links such as <a href="foobar://abc=1">open in foobar</a>
app.on('open-url', function (event, data) {
  event.preventDefault();
  link = data;
});

app.setAsDefaultProtocolClient('foobar');

// Export so you can access it from the renderer thread
module.exports.getLink = () => link;

В потоке вашего рендерера:

Обратите внимание на использование удаленного API для доступа к функции getLink, экспортированной в основной поток < / em>

<!DOCTYPE html>
<html>
  <body>
    <p>Received this data <input id="data"/></p>
    <script>
      const {getLink} = require('electron').remote.require('./main.js');
      document.querySelector('#data').value = getLink();
    </script>
  </body>
</html>

Пример

<a href="foobar://abc=1">open in foobar</a>

введите описание изображения здесь

Это также позволяет запускать из командной строки:

open "foobar://xyz=1"

введите описание изображения здесь

Как вернуться к исходному абоненту?

Я полагаю, что когда вы запускаете приложение, вы можете включить URL-адрес вызывающего абонента:

<a href="foobar://abc=1&caller=example.com”>open in foobar</a>

Когда ваше электронное приложение завершит обработку данных, оно просто отправит ответный запрос на этот URL-адрес.

Кредиты

Большинство моих выводов основаны на:

person customcommander    schedule 04.12.2018
comment
Потрясающе, рассмотрим это как можно скорее! Сработало ли это для вас при разработке, или вам нужно было создать установщик и установить его, чтобы это работало на вашем локальном компьютере? Спасибо еще раз! - person goldylucks; 05.12.2018
comment
На самом деле я не пробовал. Это действительно было проверено на упакованном и установленном приложении. - person customcommander; 05.12.2018
comment
В linux я пробовал использовать упакованное приложение с застежкой-молнией, но оно не работает. На данный момент мы не используем установщик для Linux, поэтому не можем это проверить. Будет обновлено, если мы заставим это работать. - person goldylucks; 11.12.2018
comment
Обратите внимание, что событие open-url предназначено только для Mac. Windows и Linux должны будут использовать параметр argv process.argv, чтобы просмотреть параметры и проверить, является ли один из них URL-адресом, который использовался для запуска приложения. - person mix3d; 27.08.2020