本文代码参考自:https://www.jianshu.com/p/d880c0ca0911 做者有详细说明,请认真阅读。github
只有在安装并运行过一次以后,这个功能才会生效!没有安装并运行过程序,协议固然不会被注册。浏览器
对于一个 URL 来讲,其实就是指定了一个协议(protocol),而后让系统用对应的应用去打开它。如 myapp://startapp/here?a=1&b=2,系统会去找到已经注册了 myapp 这个协议的应用,而后把 URL 当作参数传过去。app
这样咱们就能够在浏览器中经过一个 <a> 标签简单地唤起应用了。electron
<a href="PocketBook:?a=1&b=2">打开</a>
url
尝试打开code
核心代码:orm
/** * 协议处理 */ function protocalHandler() { const args = []; if (!app.isPackaged) { // 若是是开发阶段,须要把咱们的脚本的绝对路径加入参数中 args.push(path.resolve(process.argv[1])) } // 加一个 `--` 以确保后面的参数不被 Electron 处理 args.push('--') // 注册协议 const PROTOCOL = pkg.name app.setAsDefaultProtocolClient(PROTOCOL, process.execPath, args) // 若是打开协议时,没有其余实例,则当前实例当作主实例,处理参数 handleArgv(process.argv) // 其余实例启动时,主实例会经过 second-instance 事件接收其余实例的启动参数 `argv` app.on('second-instance', (event, argv) => { // Windows 下经过协议URL启动时,URL会做为参数,因此须要在这个事件里处理 if (process.platform === 'win32') { handleArgv(argv) } }) // macOS 下经过协议URL启动时,主实例会经过 open-url 事件接收这个 URL app.on('open-url', (event, urlStr) => { handleUrl(urlStr) }) // 处理参数 function handleArgv(argv) { const prefix = `${PROTOCOL}:`; // 开发阶段,跳过前两个参数(`electron.exe .`) // 打包后,跳过第一个参数(`myapp.exe`) const offset = app.isPackaged ? 1 : 2 const url = argv.find((arg, i) => i >= offset && arg.startsWith(prefix)) if (url) handleUrl(url) } // 解析Url function handleUrl(urlStr) { // myapp:?a=1&b=2 const urlObj = new URL(urlStr); const {searchParams} = urlObj; console.log(urlObj.query); // -> a=1&b=2 console.log(searchParams.get('a')); // -> 1 console.log(searchParams.get('b')); // -> 2 // 根据须要作其余事情 } }