浏览器打开应用
大家可能遇到过浏览器直接启动本地应用程序的情况,如下图所示:
这是通过浏览器使用自定义浏览器协议的标准实现的。自定义浏览器协议允许在浏览器中使用类似 protocol://url 的形式调用本地程序。例如,在网页上调用百度云网盘或者启动 QQ,都属于自定义浏览器协议的应用场景。
原理分析
浏览器本身是没有直接唤起本地应用程序的能力的,因为这样会导致任意网页都可以打开用户的所有应用,存在安全隐患。但是操作系统本身提供了这样的能力,通过配置自定义协议来实现。
举例来说,当你在浏览器中打开本地的 PDF 文件时,URL 可能是类似 file://path/xxx.pdf 的形式,这是系统内置的一个协议,浏览器可以调用这个协议来进行文件读取。
类似地,Windows 操作系统也支持用户自定义协议来执行一些操作,这些协议的配置存储在注册表中。
配置一个自己的协议
自定义一个协议用来打开Tim,新建一个demo.reg注册表文件,输入如下内容
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\Tim]
@="URL:Tim Protocol"
"URL Protocol"="D:\Tencent\Tim\Bin\Tim.exe"
[HKEY_CLASSES_ROOT\Tim\shell]
[HKEY_CLASSES_ROOT\Tim\shell\open]
[HKEY_CLASSES_ROOT\Tim\shell\open\command]
@="D:\Tencent\Tim\Bin\Tim.exe %1"
配置解释
- Windows Registry Editor Version 5.00 这行表明该文件是一个 Windows 注册表编辑器文件,这是标准的头部,用于告诉 Windows 如何解析文件。
- [HKEY_CLASSES_ROOT] 是应用程序运行时必需的信息,[HKEY_CLASSES_ROOT\Tim]表示在该注册表目录下生成了一个Tim的应用程序运行时必需的信息。@=为该应用程序默认名称,用来显示程序名称,不填则为exe名称。URL Protocol=为该协议所要调用的程序地址。
- [HKEY_CLASSES_ROOT\Tim\shell]在Tim\下生成shell目录。
- [HKEY_CLASSES_ROOT\Tim\shell\open]在Tim\shell\下生成open目录。
- [HKEY_CLASSES_ROOT\Tim\shell\open\command]在Tim\shell\open\下生成command目录,@=在command目录下新建一个默认值为协议调用程序的实际路径。%1代表Tim://后面跟的参数。
运行文件,将信息添加到注册表中!
浏览器打开Tim
在浏览器输入tim://open(协议名称加上具体命令),可以看到浏览器弹出了对话框,点击确认就会调用我们对应的程序。
写在最后
百度网盘在安装的过程中就帮我们写了这个注册文件,在网页中百度调用对应的协议,即可唤醒百度网盘,在注册表中也可以找到百度网盘的协议注册信息。
在程序开发中,我们可以利用自定义协议实现通过前端触发事件来调用本地客户端的功能。通常通过在客户端安装时注册特定协议,并在前端应用中相应事件触发时调用该协议来实现。