首页 > 解决方案 > 电子的 registerHttpProtocol 在开发中工作吗?

问题描述

我正在尝试使用电子注册自定义协议。我希望它是网站可以用来提供 api 密钥(如myprotocol://example/payload=api-key)的重定向位置。我一直在使用电子registerHttpProtocol也尝试过电子interceptHttpProtocol

但是,当网站尝试重定向到我的协议时,我的电子应用程序没有做任何事情。该网站转到myprotocol://example/payload=api-key,并注册一个“页面不存在错误”——而我的应用程序中没有任何反应。

这是在开发环境中。我看过一些关于假设生产环境的自定义协议的讨论。

您可以在开发中使用电子注册自定义协议吗?

为什么我无法拦截网站对我制定的协议的访问?

这是我的代码:

主.js:

app.whenReady().then(() => {
  protocol.registerHttpProtocol('examplep', (request, callback) => {
     console.log("examplep", request);
     callback('it-worked');
  }, (error) => {
        if (error) console.error('Failed to register protocol = ' + error)
  })

  protocol.interceptHttpProtocol("examplep", function (request, callback) {  //I've tried both registerHttp... and interceptHttp... methods, so including both here; though I think in practice only one should be required
    console.log('intercepted!' + request)
    callback(request);
  });
})

将提供的网址重定向到网站:

'http://examplep'

我已在网站本身上将此网址列入白名单。

相关方法registerStringProtocol、interceptStringProtocol、registerFileProtocol、interceptFileProtocol我也试过了,都没有成功。


我错过了什么?

标签: electronelectron-builder

解决方案


听起来您需要支持桌面应用程序的深度链接,这是通过自定义 URI 方案完成的,并在setAsDefaultProtocolClient.

当您的 Electron 应用程序启动时,在您的应用程序的主端编写此代码来注册方案:

const customScheme = 'x-mycompany-myapp';
app.setAsDefaultProtocolClient(customScheme);

可以像这样从命令行测试自定义方案,具体取决于您运行的是 macOS 还是 Windows:

open  x-mycompany-myapp:/some/location
start x-mycompany-myapp:/some/location

Web 客户端只会调用我的这个 Javascript 代码中的 URL ;

通知将在您的应用程序的主端接收,并且在 Windows 上将尝试创建应用程序的新实例,在这种情况下,您需要检测这种情况,处理通知然后取消新的应用程序实例。

在 MacOS 上,它将在 open-url 事件中接收,因此您可以像这样注册它:

app.on('open-url', this._onOpenUrl);

一旦 Electron 应用程序的主端收到通知,它需要获取 URL 信息并将其转发给渲染器进程。您可以为此使用ipcMain 事件

最后,在运行实例中接收通知和从深层链接启动应用程序的代码是不同的。

示例应用

由于代码有点棘手,这里有一些可能有用的示例代码,给你一些比较的东西。如果有帮助,您还可以按照博文中的说明运行该应用程序:

我的用例是在从系统浏览器登录后接收 OAuth 响应。希望您可以从中借鉴一些与深度链接相关的想法。

信息列表

我的理解是,在开发环境中(在 macOS 上),深层链接在应用程序运行时起作用,但如果您停止应用程序并尝试深层链接,它将不会启动应用程序。

您只能为需要 info.plist 的打包应用解决此问题。在我的代码示例中,info.plist 是从package.json 文件中的构建协议条目生成的。

我的代码示例由 Electron Packager 以基本方式打包,因此当我运行时npm run pack,应用程序将构建到 dist 文件夹。然后我可以运行该应用程序的打包版本,它会在系统中注册 - 如默认应用程序工具中所示。请参阅博客文章中的屏幕截图。

秘密

桌面应用程序的机密应使用操作系统安全存储进行存储。博文中有凭证存储的屏幕截图。

在 Electron 上,看看keytar组件 - 以及我的这个包装类。我正在存储令牌(字符串),因此您应该能够为您的 API 密钥调整代码。


推荐阅读