如何从网站启动我的电子应用程序

时间:2018-11-29 01:51:28

标签: electron electron-builder

我们有一个电子加密应用程序可以签署交易(除其他事项外)。

我们希望其他网站具有打开该电子应用程序的按钮的功能,该按钮预先填充了一些参数(交易信息)。

流为:

  1. 用户点击some-crypto-site.com上的“进行交易”
  2. 电子应用程序打开并带有预填充的参数
  3. 用户点击电子应用中的“签署交易”
  4. 电子应用程序确实在幕后
  5. 电子应用程序关闭并发送消息到some-crypto-site.com

这可以在运行时或安装时完成。

我尝试过的操作(Linux,Chrome)

使用app.setAsDefaultProtocolClient的代码调用this gist,基本上是:

app.setAsDefaultProtocolClient("my-app")

但是在将my-app://foo?bar=baz放在chrome浏览器中之后,我得到了以下弹出窗口,然后按open-xdg不执行任何操作(除了关闭弹出窗口)

enter image description here

我调查了

  1. 电子protocol api似乎仅处理应用程序内协议
  2. webtorrent .desktop file,这可能是解决之道,我不确定该怎么做。

也许有一种方法可以在安装时通过electron builder来做到这一点?

在此先感谢您的帮助,我不知道该如何进行!

可能有用的资源

  1. github repo with mac+window example
  2. github comment for linux
  3. github comment for linux 2
  4. SO answer for all 3 OSs
  5. SO windows answer
  6. npm package for windows registery
  7. SO mac answer
  8. SO linux answer
  9. microsoft docs for windows
  10. windows article
  11. github comment for windows
  12. github comment for mac
  13. info.plst for mac
  14. old repo for mac and win

1 个答案:

答案 0 :(得分:11)

由于这可能与我在工作中所做的事情有关,所以我决定尝试一下。 我只是在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;

在渲染器线程中:

注意使用remote API来访问在主线程中导出的getLink函数

<!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>

enter image description here

这还允许您从命令行启动:

open "foobar://xyz=1"

enter image description here

您如何返回到原始呼叫者?

我想当您启动该应用程序时,您可以包含呼叫者网址:

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

当您的电子应用程序完成数据处理后,只需回溯该网址即可

积分

我的大部分发现基于: