Web调用本地程序:Custom URL Scheme
在一些业务场景中,我们希望通过浏览器直接调用本地程序,例如点击按钮启动远程桌面客户端、打开调试工具、拉起企业内部应用。由于浏览器出于安全考虑不能随意执行本地程序,常见的解决方法之一就是 自定义 URL 协议(Custom URL Scheme)。
一、核心思路
自定义协议就是给操作系统注册一个类似 myapp://
的 URL 前缀,当浏览器访问该协议时,系统会调用我们指定的本地应用,并将 URL 作为参数传入。
示例:
myapp://open?file=test.txt
会触发系统调用我们的程序,并把 myapp://open?file=test.txt当成一个字符串参数
传进去。
二、Windows 平台实现
在 Windows 中,我们可以通过 注册表 注册自定义协议。步骤如下:
1. 新建 .reg
文件
在任意文件夹下新建一个文本文件,命名为 myapp.reg
,内容如下:
Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\myapp]
@="MyApp Protocol"
"URL Protocol"=""[HKEY_CLASSES_ROOT\myapp\DefaultIcon]
@="C:\\Program Files\\MyApp\\myapp.exe,1"[HKEY_CLASSES_ROOT\myapp\shell][HKEY_CLASSES_ROOT\myapp\shell\open][HKEY_CLASSES_ROOT\myapp\shell\open\command]
@="\"C:\\Program Files\\MyApp\\myapp.exe\" \"%1\""
HKEY_CLASSES_ROOT\myapp
→ 定义了协议名myapp://
。
URL Protocol
→ 告诉系统这是一个 URL 协议。
DefaultIcon
→ 设置协议对应的图标(可选)。
command
→ 当调用myapp://xxxx
时,实际执行的命令,这里是C:\Program Files\MyApp\myapp.exe
,并把整个 URL 作为参数%1
传入。
2. 导入注册表
双击 myapp.reg
文件,点击 是(Y) → 确定,即可完成注册。
完成后,浏览器访问 myapp://
就会自动启动 myapp.exe
。
三、Linux 平台实现
在 Linux 桌面环境(GNOME/KDE)中,可以通过 .desktop
文件注册协议。
例如在 /usr/share/applications/myapp.desktop
中添加:
[Desktop Entry]
Name=MyApp
Exec=/usr/local/bin/myapp %u
Type=Application
MimeType=x-scheme-handler/myapp;
然后执行:
xdg-mime default myapp.desktop x-scheme-handler/myapp
update-desktop-database /usr/share/applications
此后,浏览器访问 myapp://的uri
就会调用 /usr/local/bin/myapp
。
注意: update-desktop-database 只处理~/.local/share/applications/
或 /usr/share/applications/下的.desktop文件,放在其他路径下无效
可验证操作:
#查询对应协议对应的应用程序
xdg-mime query default x-scheme-handler/myapp
# 测试是否能启动
xdg-open "myapp://open?file=test.txt
"
四、验证
不能直接在浏览器地址栏输入 myapp://
进行测试,大多数现代浏览器会拦截。
正确的验证方式是通过 HTML 页面触发:
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>自定义协议测试</title></head><body><a href="myapp://open?file=test.txt">启动 MyApp</a><script>// 也可以用 JS 触发function launchApp() {window.location.href = "myapp://open?file=test.txt";}</script><button onclick="launchApp()">通过按钮启动 MyApp</button></body>
</html>
在浏览器里打开该页面,点击 链接 或 按钮,系统会提示是否允许打开外部应用,确认后会执行你注册的程序。
五、总结
Windows:通过注册表实现;
Linux:通过
.desktop
文件和xdg-mime
实现;验证方法:需要在 HTML 链接或 JS 脚本 中调用,而不是直接在地址栏输入。
自定义协议方案简单高效,适合只需要 启动本地程序并传参 的场景,是在 Web 与本地应用之间打通的最常见方式。