electron - 电子的 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我也试过了,都没有成功。
我错过了什么?
解决方案
听起来您需要支持桌面应用程序的深度链接,这是通过自定义 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 密钥调整代码。
推荐阅读
- java - Loop through n number of maps
- r - Error in file(out, "wt") : cannot open the connection while writing xlsx
- visual-studio - 新的 Symbol Nuget 包是否允许在本地编辑 Nuget?
- c# - How to check if an excel file contains a footer using C#?
- php - 端点无法使用 SLIM 框架在 PHP 中正确发出 POST 请求
- azure - 使用 Microsoft.Azure.Services.AppAuthentication 库为 Azure 服务以外的资源生成访问令牌
- escaping - Zend Framework 3 - 元标签奇怪地转义 - 对规范 url 的影响?
- android - 我可以使用来自不同谷歌项目的两个谷歌服务 json 文件吗?
- php - 所有 css/img 文件都路由到网站的主页
- c++ - 静态链接 libc++ clang