如何为Electron应用注册协议/深度链接?开发模式唤起报错解决
问题复现场景
启动应用报错:"Unable to find Electron app at..."
- 基于electron-react-boilerplate脚手架开发
- 已查阅官方Deep Links(深度链接)、Protocol(自定义协议)文档,生产环境打包.exe后自定义链接唤起功能正常
- 开发模式下访问自定义协议时弹出上述报错,无法捕获唤起事件供前端逻辑处理
- 报错截图:

根因
开发模式下Electron实际通过全局/项目内的electron命令启动,运行入口指向node_modules下的Electron可执行文件,而非打包后的应用程序。直接照搬生产环境的协议注册逻辑时,系统会把自定义协议的唤起请求直接发给Electron可执行文件,没有传入当前开发项目的入口路径参数,Electron找不到对应应用入口就会抛出该错误。
修复步骤
- 区分环境调整协议注册逻辑
在主进程入口文件中,不要直接调用setAsDefaultProtocolClient,先判断运行环境,开发模式下补全应用入口参数:const PROTOCOL = '替换为你自己的自定义协议名'; const { app } = require('electron'); const path = require('path'); // 开发环境判断:process.defaultApp为true即代表通过electron命令启动的开发模式 if (process.defaultApp) { if (process.argv.length >= 2) { app.setAsDefaultProtocolClient( PROTOCOL, process.execPath, [path.resolve(process.argv[1])] // 传入当前开发项目的入口路径作为启动参数 ); } } else { // 生产环境保持原有注册逻辑即可 app.setAsDefaultProtocolClient(PROTOCOL); } - 补全单实例场景下的链接参数捕获
在主进程单实例锁逻辑中,监听second-instance事件统一捕获唤起传入的自定义链接,通过IPC发送给前端渲染进程:const gotTheLock = app.requestSingleInstanceLock(); if (!gotTheLock) { app.quit(); } else { app.on('second-instance', (_, commandLine) => { // 提取自定义链接 const deepLink = commandLine.find(item => item.startsWith(`${PROTOCOL}://`)); // 替换为你项目中获取主窗口实例的方法 const win = mainWindow; if (!win) return; // 激活窗口 if (win.isMinimized()) win.restore(); win.focus(); // 有自定义链接时发给前端 if (deepLink) { win.webContents.send('deep-link-receive', deepLink); } }); } - 清除Windows下残留的错误注册项
之前错误注册的协议信息会留在注册表中,需要手动清理:按Win+R输入regedit打开注册表编辑器,定位到计算机\HKEY_CLASSES_ROOT\路径下,找到和你自定义协议名同名的文件夹,整个删除即可。 - 重启开发服务验证
重新跑npm start启动开发环境,点击自定义协议链接即可正常唤起开发中的应用,不会再弹出找不到应用的报错,前端监听对应IPC事件就能拿到链接参数处理业务逻辑。
内容的提问来源于stack exchange,提问作者Bruno Filho
相关产品推荐
相关产品推荐

