电子的 registerHttpProtocol 是否在开发中工作?

Does electron's registerHttpProtocol work in development?

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

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

这是在开发环境中。我已经看到 some discussion 关于假定生产环境的自定义协议。

开发中可以用electron注册自定义协议吗?

为什么我无法拦截网站使用我设定的协议?

这是我的代码:

main.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);
  });
})

重定向 url 提供给网站:

'http://examplep'

我已经在网站上将此 url 列入白名单。

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


我错过了什么?

听起来您需要为桌面应用程序支持深度 linking,这是通过自定义 URI 方案完成的,并已在 setAsDefaultProtocolClient 中注册。

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

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

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

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

Web 客户端将只调用 URL,如 this Javascript code of mine;

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

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

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

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

最后,运行ning 实例中接收通知的代码与从深层 link 启动应用程序的代码不同。

示例应用程序

由于代码有点棘手,这里有一些可能有用的示例代码,可以让您进行比较。如果有帮助,您还可以按照博客 post:

中的说明 运行 该应用程序

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

INFO.PLIST

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

您只能为需要 info.plist 的打包应用解决此问题。在我的代码示例中,info.plist 是从 build protocol entries in the package.json file.

生成的

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

秘密

桌面应用程序的秘密应该使用操作系统安全存储来存储。博客中有凭证存储的截图post.

在 Electron 上,看看 keytar component - and this wrapper class of mine。我正在存储令牌(字符串),因此您应该能够为您的 API 键调整代码。