前端网页唤起客户端通信实践

以云看科技 2024-02-01 15:01:02

0

TARGET

需求目标

需求场景:突然收到产品一个需求,希望在已登陆的网页上能够唤起桌面端软件(Windows,exe)并且免登录跳转至指定路由位置,就像百度网盘那样,我将方案和完成示例的整个过程记录并整理成文档。

01

START CLIENT

唤起客户端

纯浏览器环境没有执行权限去打开软件,通过Electron、Node、浏览器插件可以打开软件,但不符合需求场景或成本略高。

所以选择通过请求URL Protocol协议来达到目的,可以在安装客户端时将所需信息写入注册表,或者通过单独的注册表执行文件将信息写入注册表,在通过链接访问这个协议时,就会通过注册表找到相应的软件位置。

Windows Registry Editor Version 5.00//HKEY_CLASSES_ROOT:注册表主目录,MyProjectName:协议名称[HKEY_CLASSES_ROOT\MyProjectName] @="URL:MyProjectName Protocol Handler""URL Protocol"=""[HKEY_CLASSES_ROOT\MyProjectName\DefaultIcon]@="G:\\Install\\Microsoft VS Code\\Code.exe %1"[HKEY_CLASSES_ROOT\MyProjectName\shell][HKEY_CLASSES_ROOT\MyProjectName\shell\open][HKEY_CLASSES_ROOT\MyProjectName\shell\open\command]//指定exe的路径,本例子是 vscode@="G:\\Install\\Microsoft VS Code\\Code.exe %1"

新建txt文档,将以上代码输入,格式为Unicode,保存并修改文件类型为reg,双击执行,信任并将注册表成功导入。

导入成功后通过快捷键(win+R)输入regedit 打开注册表查看。

通过链接请求URL Protocol协议,打开客户端。

<a href="MyProjectName://">启动客户端</a>

点击打开,则成功唤起客户端。

02

COMMUNICATION

网页与客户端通信

因为需要在网页端登陆并唤起客户端,客户端免登陆过程并跳转到指定路径,所以需要双方通信,并将相关token信息和路由信息传递接收。

1、协议请求:通过协议请求地址携带参数

通过协议请求传递Token和位置信息,将参数拼接在协议地址之后,请注意敏感数据不要明文暴露。

<a href="MyProjectName://token=123&position=234" id='Btn'>启动客户端</a>

客户端工程师可通过该协议接收参数,数据格式为String,并包含协议名,可通过约定格式获取相关数据。

string _UserInfo = "MyProjectName://token=123&position=234"

优点:实现简单,代码量低,通信不容易被监听。

缺点:只能单向通信,需要客户端开启浏览器,通过路由地址携带参数的方式才能显示双向通信。

2、监听剪切板:通过剪贴板传递数据参数

双方约定数据格式,(如:MyProjectName://),监听到约定格式后开始获取相关数据,获取后清空剪切板,请注意敏感数据不要明文暴露。

const link = 'MyProjectName://'; // 私有协议 const token = '123'; const position = '234'; const url = `${link}token=${token}&position=${position}`; // 全参数 const clipboard = new ClipboardJS('#btn', { text: (e) => url,//粘贴板返回url }); $('#btn').click((e) => { clipboard.destroy(); // 取消剪贴板绑定 clipboard.onClick(e); // 手动调用 onClick 事件触发剪贴板拷贝 }); clipboard.on('success', (e) => { console.log('url:', e.text); // 成功回调 url: MyProjectName://token=123&position=234 });

优点:双方可以通过约定格式和反复监听板来实现双向数据传输。

缺点:需要频繁监听剪贴板数据,并且有一定数据泄露风险。

03

THINKING

思考场景中的问题

问题:当URL Protocol协议成功写入注册表后,用户未安装客户端,或者手动删除应用程序文件该如何处理呢?

需要判断当前环境是否安装了该应用程序:

单纯通过浏览器环境内是无法获得应用安装信息的,需要activex、wscript.shell等控件支持,并需要额外的授权确认。

上述方式开发成本高,有兼容问题,并带来不确定的合规风险。

经过对百度网盘的使用分析,它采用的更为简单的一种方式:

点击唤起:当在网页端点击下载按钮,发起URL Protocol协议请求时。

发起轮询:会创建一个定时器,并开始轮询请求网页在定时器时间范围内(如10s)轮询获得服务端返回的唤起结果。

唤起成功:当客户端存在时,会唤起该软件,并传递参数,客户端将参数与服务端请求,轮询接口结果成功,表示已成功唤起。建立连接:当唤起成功后,建立连接,数据通信,客户端进行指定行为操作。唤起失败:在定时器范围内,轮询请求结果未成功连接,则表示唤起失败。引导下载:唤起失败后,则引导用户重新下载客户端并安装,重新写入注册表,重试整个过程。

04

SUM UP

总 结

最后将上述过程整理并制作成流程图,成为一个解决网页唤起客户端的解决方案。

作者:RDC-FE

来源:微信公众号:团子技术团队

出处:https://mp.weixin.qq.com/s/k-Aw5tEix-j8wmnBNG2Q4g

0 阅读:84

以云看科技

简介:感谢大家的关注