Electron通过网页调起客户端

Electron网页调起客户端

Electron网页调起客户端 

BY XUXIN · PUBLISHED 2021年7月2日 · UPDATED 2021年7月5日

相信大家平时使用浏览器时遇到过点击一个链接或者按钮,浏览器会询问是否打开客户端,移动端和桌面端都有这种情况。比如百度网盘,在网页上点击链接时会拉起百度网盘的客户端进行下载,实际上这些功能都是通过注册伪协议来实现的,本篇主要介绍如何通过伪协议调起Electron客户端,并获取伪协议传过来的参数。

实现目标

  1. 为Electron添加一个伪协议(URL Scheme 协议)。

  2. 在浏览器网页上添加一个伪协议的点击。拉起应用。

Mac的URL Scheme

Mac上每个应用包中都有一个info.plist文件,这个一般用作于一些访问权限的配置及软件的信息,ios开发的同学可能比较熟悉,注册URL Scheme实际上是在这个文件中添加对应的key,value。我们可以查看一些软件的URL Scheme

  1. 访达中找到桌面软件,比如vscode。

  2. 右键显示包内容。

  3. 进入Contents文件夹。

  1. 找到info.plist,直接点击查看或者用vscode打开,这个CFBundleURLName就是协议名,CFBundleURLSchemes为协议内容
  1. 浏览器输入对应的URL Schemevscode://file/${filePath},filePath为文件的pwd路径,看是否vscode能打开对应文档。

Windows的URL Scheme

Windows上是通过在注册表中添加URL Protocol来实现伪协议的,其实说简单点也是添加key,value值。同上,我们查看一下vscode:

  1. win+r输入regedit确定。

  2. 找到HKEY_CLASSES_ROOT\vscode,不好找的可以Ctrl+F勾选数据进行搜索’URL:vscode’,可以找到两处HKEY_CURRENT_USER\Software\Classes\vscode,当然这两处值都是一样的。

  1. 我们可以右键vscode目录将其导出成一个reg文件,可以看到关键处在两点,一个URL:vscode,还有一个是vscode的启动路径。

也就是说检测到vscode://会执行下面的exe命令,%1是唤起软件的伪协议,浏览器打开vscode://file/${filePath}试试,比如我的vscode://file/F:/work/electron/vue-cli-electron/README.md,看是否vscode能打开对应文档

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\vscode]
"URL Protocol"=""
@="URL:vscode"

[HKEY_CLASSES_ROOT\vscode\shell]

[HKEY_CLASSES_ROOT\vscode\shell\open]

[HKEY_CLASSES_ROOT\vscode\shell\open\command]
@="\"E:\\Microsoft VS Code\\Code.exe\" --open-url -- \"%1\""

JavaScript

Copy

实现URL Scheme

这里介绍一下Electron上实现伪协议的两种方式:

  1. 通过setAsDefaultProtocolClient注册协议

这个要讲的不多,看文档的东西链接,在主进程直接写上就可以:

import { app } from 'electron'

if (!app.isDefaultProtocolClient('vue-cli-electron')) {
  app.setAsDefaultProtocolClient('vue-cli-electron')
}

JavaScript

Copy

打包后安装软件,打开软件,尝试在浏览器中打开vue-cli-electron://,看是否有唤起提示。

  • 优点:简单,快捷。
  • 缺点:首先这个是在主进程中执行的,也就是说首次安装软件后必须打开软件后才会写入对应的URL Scheme,软件卸载时Mac的info.plist在包内,一起删除了,但Windows是写入注册表的,并不会被主动清理,卸载软件后再打开伪协议还是会有打开软件的提示。
  1. electron-builder + nsis

使用electron-builder进行配置在可以打包(安装)时就写入伪协议,并且可以在卸载的拓展宏里进行注册表的清理,使用此方式的话,方案1的注册可以除去掉。

  • Mac配置:在vue.config.js中的builderOptions添加electron-builder的配置链接
    protocols: [{
      name: 'vue-cli-electron',
      schemes: ['vue-cli-electron']
    }],
    

    JavaScript

    Copy

    这里要注意的是文档展示有点问题,fileAssociations和protocols是属于同级的,并不是fileAssociations里面的。这样我们就完成了Mac系统伪协议的配置。

  • Windows配置:在项目根目录新建installer.nsh,同样的在builderOptions的nsis中添加include: "installer.nsh"

    installer.nsh

    !macro customInstall
      DeleteRegKey HKCR "vue-cli-electron"
      WriteRegStr HKCR "vue-cli-electron" "" "URL:vue-cli-electron"
      WriteRegStr HKCR "vue-cli-electron" "URL Protocol" ""
      WriteRegStr HKCR "vue-cli-electron\shell" "" ""
      WriteRegStr HKCR "vue-cli-electron\shell\Open" "" ""
      WriteRegStr HKCR "vue-cli-electron\shell\Open\command" "" "$INSTDIR\{APP_EXECUTABLE_FILENAME} %1"
    !macroend
    
    !macro customUnInstall
      DeleteRegKey HKCR "vue-cli-electron"
    !macroend
    

    NSIS

    Copy

    注意:$INSTDIR后的{APP_EXECUTABLE_FILENAME}前有个$,完整是${APP_EXECUTABLE_FILENAME},我这里直接写markdown不知为啥解析不了,请自行替换。

    这里简单介绍一下,customInstall是electron-builder提供的NSIS拓展宏,看名字这个是安装时执行的,同理customUnInstall是卸载执行,其他情况参考链接

    • DeleteRegKey是删除注册表

    • HKCR即我们上面说的HKEY_CLASSES_ROOT的简写,HKCU->HKEY_CURRENT_USER,HKLM->HKEY_LOCAL_MACHINE,HKU->HKEY_USERS

    • WriteRegStr是写入注册表

    • $INSTDIR是我们选择的安装路径

    • ${APP_EXECUTABLE_FILENAME}是软件exe名

好了,现在我们可以打包安装,尝试在浏览器中打开vue-cli-electron://,Windows卸载软件后再在浏览器中打开vue-cli-electron://看还会有提示没有。

  • 优点:万金油模式,自由度大,功能全面。

  • 缺点:麻烦,需要一定的nsis知识。

开发环境配置伪协议

上面两种方式都说完了,这算是一个补充吧,毕竟我们在开发时不可能写一点就打个包测试,挺费时间的。

我们在开发时一般直接使用setAsDefaultProtocolClient进行伪协议设置,但是设置后在打开网页上的伪协议链接时会报一个错误,但是打包后又是好好的,这是什么造成开发和打包之后的差异呢?

这里就补充一个知识点,我们的开发环境是怎么启动的,我们可以打印一下process.argv,这个就是Electron的启动参数,我们可以看到开发环境是(Mac同理,路径不同):

[
  'F:\\work\\electron\\vue-cli-electron\\node_modules\\electron\\dist\\electron.exe',
  'dist_electron'
]

JavaScript

Copy

看到这里大多数同学可能已经明白了,开发环境是启动一个node包的exe,然后传入我们webpack构建好的目录而启动的服务,而这个参数在打包后则是软件的exe文件

xxxxxxxx\\electron开发.exe

JavaScript

Copy

我们看一下完整的伪协议app.setAsDefaultProtocolClient(protocol[, path, args])protocol是协议名,path是Electron可执行文件路径(也就是exe地址,默认process.execPath),args传递给可执行文件的参数,默认为空数组。

那么也就得出答案了:

app.setAsDefaultProtocolClient('vue-cli-electron')
这个注册时只有protocol和path,故在开发环境通过vue-cli-electron://启动时,只启动了那个node包的exe,我们后面的构建目录并没有在注册时写入。

JavaScript

Copy

那么我们只需要进行一下判断,把这个目录追加到args里即可

if (app.isPackaged) { // 是否处于打包
  app.setAsDefaultProtocolClient('vue-cli-electron')
} else {
  app.setAsDefaultProtocolClient('vue-cli-electron', process.execPath, [
    path.resolve(process.argv[1])
  ])
}

JavaScript

Copy

注:如果你使用了上面这种方式且开发的协议和打包后的协议名一样的话,打包前你得把开发环境注册的协议删除掉(开发时主进程加上这一句保存一下,然后删除掉就行了),否则你自己的电脑调用伪协议可能会启动到开发的electron包哦,现在试试本地开发能否通过伪协议拉起我们的客户端。

app.removeAsDefaultProtocolClient('vue-cli-electron', process.execPath, [path.resolve(process.argv[1])])

JavaScript

Copy

本来想把如何获取伪协议链接中的参数也放在这一期的,但是感觉这样篇幅太长了不利于阅读,那么放在下一期更新吧,敬请期待。

本系列更新只有利用周末和下班时间整理,比较多的内容的话更新会比较慢,希望能对你有所帮助,请多多star或点赞收藏支持一下

本文地址:Electron网页调起客户端 - 陌路凡歌 electron 前端的技术分享与个人见解

本文github地址:链接

各位朋友做协议时应该见过如下url: tencent://message/?uin=88888Site=bbs.125.laMenu=yes 复制代码 在浏览器里打开这个连接,会唤起qq的聊天窗口,并且根据传递的参数88888,打开了与88888的强制聊天窗口,如下图: 又比如打开浏览器,输入 steam://install/943700 复制代码 居然会唤起steam的安装界面,安装某个游戏。 是否想知道他们是如何实现的呢? 通过注册表中的探索,发现了秘密: 导出注册表查看: Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\steam] @="URL:steam protocol" "URL Protocol"="" [HKEY_CLASSES_ROOT\steam\DefaultIcon] @="Steam.exe" [HKEY_CLASSES_ROOT\steam\Shell] [HKEY_CLASSES_ROOT\steam\Shell\Open] [HKEY_CLASSES_ROOT\steam\Shell\Open\Command] @="\"C:\\Program Files (x86)\\Steam\\Steam.exe\" -- \"%1\"" 原来是在这里的定义了私有协议,我们依葫芦画瓢,来定义一个自己的私有协议“Mofei”吧。 构造一个注册表: Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\Mofei] @="URL:Mofei Protocol Handler" "URL Protocol"="" [HKEY_CLASSES_ROOT\Mofei\shell] [HKEY_CLASSES_ROOT\Mofei\shell\open] [HKEY_CLASSES_ROOT\Mofei\shell\open\command] @="C:\\Users\\Administrator\\Desktop\\test.exe \"%1\"" 以上代码中"Mofei"为需要注册的协议名,例如Tencent/steam。 下面的 HKEY_CLASSES_ROOT\Mofei\shell\open\command的键值“ C:\\Users\\Administrator\\Desktop\\test.exe ”为要处理的程序的路径。 可以将以上代码通过记事本保存为xx.reg,双击此注册表文件导入。也可以通过精易模块 自行操作注册表来创建表项和键值。 此一步的目的是告诉windows,假如计算机请求的url是以"mofei://"为开头,就交给注册表中用户自定义的程序来处理,且整个请求的url内容作为启动参数,传递给应用程序。 例如在你的浏览器中打开 "mofei://hahaha",此时windows将会启动我们设定的test.exe程序,并且将"mofei://hahaha"作为启动参数传递给test.exe。 现在我们启动易语言 ,新建一个空白无窗口程序,写下如下代码: 窗口程序集名 保 留 保 留 备 注 程序集1 子程序名 返回值类型 公开 备 注 _启动子程序 整数型 请在本子程序中放置动态链接库初始化代码 变量名 类 型 静态 数组 备 注 aa 文本型 0 取命令行 ( aa) 信息框 ( aa[ 1] , 0, ,) 返回 ( 0) ' 返回值被忽略。 将程序编译为test.exe,放置到桌面上(我们事先定义的路径)。 现在,我们打开任意浏览器(大部分浏览器都支持私有协议),输入我们注册的"mofei://hahaha",处于安全考虑,首次使用新注册的私有协议时浏览器程序会先询问是否允许,选择允许即可。 于是,你看到了如下界面,此时我们自己注册的私有协议就成功的拉起了我们的程序。 firefox和chrome都可以哦: 现在,我们可以取出参数供我们的程序使用。 窗口程序集名 保 留 保 留 备 注 程序集1 子程序名 返回值类型 公开 备 注 _启动子程序 整数型 请在本子程序中放置动态链接库初始化代码 变量名 类 型 静态 数组 备 注 aa 文本型 0 取命令行 ( aa) 信息框 ( 取文本中间 ( aa[ 1] , 9,取文本长度 ( aa[ 1] ) - 9) , 0, ,) 返回 ( 0) ' 返回值被忽略。 用firefox来看一下执行结果。 个别浏览器会对传入的中文参数进行url编码,例如chrome,如果你的程序中未判断参数编码,就会造成如下状况,如下演示: 不止是浏览器可以唤起,连windows的资源管理器也可以唤起哦。 甚至连易语言也可以唤起哦。 方
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值