使用 electron-builder 向 macOS info.plist 添加协议的正确方法是什么?

What is the correct way add a protocol to the macOS info.plist using electron-builder?

我需要能够从浏览器启动我的 Electron 应用程序(就像登录 Slack 一样)。我知道我可以在 Electron 中使用 app.setAsDefaultProtocolClient(protocol[, path, args]) 将我的协议名称添加到我的 Electron 应用程序中。

然后在 electron-builder 中,我可以使用 package.json 配置 build.macextendInfo 属性 来定义“[=23 的额外条目=]”。然而,这是文档给出的关于如何使用它的唯一说明。

使用 electron 和 electron-builder 配置 build.mac.extendInfo 将协议添加到 macOS info.plist 并能够按照描述使用它的正确方法是什么?

此问题与如何使用自定义方案接收 OAuth 响应有关,如我的代码示例中所示,您可以在本地 运行,然后使用深度链接等:

兴趣点:

  • 浏览器应用程序的插页式网页 returns 控件 - 请参阅 this page
  • 我的 package.json 公开了 Electron 部署方案

这应该可以让您进行比较。这是关键代码:

插页式网页调用应用程序

window.addEventListener('DOMContentLoaded', function() {

    var redirectUri = 'x-mycompany-desktopapp:/callback';
    if (window.location.search) {
        redirectUri += window.location.search;
    }

    document.getElementById('continueButton').onclick = function() {
        window.location.href = redirectUri;
    };
}

注册计划

这被 Electron 打包器拾取并包含在平台特定的二进制文件中,导致 OS 特定注册:

"build": {
    "protocols": {
      "name": "finaldesktopapp",
      "schemes": [
        "x-mycompany-desktopapp"
      ]
    }
  },

正在接收通知

这使得以下代码能够在应用程序的主端运行,如 main.ts 文件中所指定:

app.setAsDefaultProtocolClient(this._configuration.oauth.privateSchemeName);

最后,您注册了一个可以解析 URL 的回调并采取任何适当的操作 - 在我的例子中完成登录。

private _receiveNotificationInRunningInstance(privateSchemeUrl: string) {
}

机制有点棘手,在 macOS 和 Windows / Linux 上接收通知的方式不同。请参阅 this source file 及其解释详细信息的注释。

(代表问题作者发布解决方案,将其移至答案space).

它现在适用于以下内容 - 我已将其添加到我的 Electron package.json:

        "protocols": {
            "name": "my-app",
            "schemes": [
                "my-app"
            ]
        },
        "mac": {
            "target": "dmg",
            "extendInfo": "my-app"
        },

我在 electron.js 中有这个:

app.setAsDefaultProtocolClient('my-app');

在我的 React 浏览器客户端应用程序代码中从浏览器启动应用程序:

document.location = 'my-app://open?url='