如何从网站上发布我的电子应用程序

gol*_*cks 14 electron electron-builder

我们有一个签署交易的电子加密应用程序(除此之外).

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

流程是:

  1. 用户点击some-crypto-site.com上的"make transaction"
  2. 电子应用打开了预先填充的参数
  3. 用户点击电子应用中的"签署交易"
  4. 电子app在幕后做的事情
  5. 电子应用程序关闭并向some-crypto-site.com发送消息

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

我试过的(linux,chrome)

app.setAsDefaultProtocolClient这个要点的代码调用,基本上是:

app.setAsDefaultProtocolClient("my-app")
Run Code Online (Sandbox Code Playgroud)

但是在我放入my-app://foo?bar=bazChrome浏览器之后,我得到以下弹出窗口,按下open-xdg什么都不做(除了解除弹出窗口)

在此输入图像描述

我调查了一下

  1. 电子协议api似乎只处理应用内协议
  2. webtorrent .desktop文件这可能是要走的路,我只是不确定如何去做.

也许有一种方法可以在安装时通过电子制造商这样做?

在此先感谢您的帮助,我不知道如何继续前进!

可能有用的资源

  1. 使用mac + window示例的github repo
  2. github评论linux
  3. github评论linux 2
  4. 所有3个操作系统的答案
  5. SO窗口回答
  6. 用于windows registery的npm包
  7. 所以回答
  8. 所以linux回答
  9. 用于Windows的microsoft docs
  10. windows文章
  11. github对windows的评论
  12. github评论mac
  13. info.plst for mac
  14. 旧的回购为mac和胜利

cus*_*der 16

由于这可能与我在工作中所做的相关,我决定试一试.我只在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"
      ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

在你的主线程中:

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;
Run Code Online (Sandbox Code Playgroud)

在您的渲染器线程中:

请注意使用远程 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>
Run Code Online (Sandbox Code Playgroud)

<a href="foobar://abc=1">open in foobar</a>
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

open "foobar://xyz=1"
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

你如何回到原来的来电者?

我想当你启动应用程序时,你可以包含来电者网址:

<a href="foobar://abc=1&caller=example.com”>open in foobar</a>
Run Code Online (Sandbox Code Playgroud)

当您的电子应用程序完成处理数据时,它只会ping回该网址

积分

我的大部分发现都基于:

  • 请注意,“open-url”事件仅适用于 Mac。Windows 和 Linux 需要使用 process.argv 的 argv 参数来循环遍历参数并检查其中之一是否是用于启动应用程序的 url。 (2认同)