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

Posted

技术标签:

【中文标题】使用 electron-builder 向 macOS info.plist 添加协议的正确方法是啥?【英文标题】:What is the correct way add a protocol to the macOS info.plist using electron-builder?使用 electron-builder 向 macOS info.plist 添加协议的正确方法是什么? 【发布时间】:2022-01-01 22:47:33 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

它现在适用于以下内容 - 我已将其添加到我的 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='

【讨论】:

【参考方案2】:

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

Code Blog Post

兴趣点:

插页式网页将控制权返回给浏览器应用程序 - 请参阅 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 打包程序提取并包含在特定于平台的二进制文件中,从而导致特定于操作系统的注册:

"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 及其 cmets 来解释详细信息。

【讨论】:

嗨@Gary Archer,非常感谢您的回答,一旦我有时间深入了解您提供的所有链接,我会回到这里! 这看起来很有帮助,但它完全是一个“仅链接的答案”。能不能把一些内容带进去,这样任何链接断开都不会影响到它? 感谢 Gary 的编辑 - 非常有帮助。 (少量反馈 - 您可以在 Markdown 中使用一种标题样式,为搜索引擎和屏幕阅读器提供语义/结构信息:在标题文本下使用 ---)。 感谢halfer - 欢迎随时提供反馈...

以上是关于使用 electron-builder 向 macOS info.plist 添加协议的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

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

用electron将Vue项目打包为window和Mac桌面应用 (electron-packager与electron-build)

电子制造商:EACCES:权限被拒绝

Mac Electron App 签名后打开闪退

Electron 和 TypeScript (electron-builder):“不能在模块外使用 import 语句”

Electron 使用 electron-builder 创建 MSI 安装程序