通过网页调用本地应用程序

如果你在某个网站点击某个按钮后,它提示打开本地的某个应用,其实无外乎这三种情况:
自定义 URL Scheme(Protocol Handler)🌟
原理
如果你看到网页点按钮能直接启动本地软件,99% 情况是它调用了一个自定义 URL 协议(比如 wechat://
、alipay://
、mycompanyapp://
)。
所需的关键数据只有:
-
协议名(scheme):例如
myapp://
-
调用参数(路径和 query 参数),例如
myapp://open?file=test.doc
-
用户必须已安装并注册该协议的应用
-
软件安装时在系统注册的处理方式(Windows 注册表 / macOS plist / Linux desktop entry)
使用方法
如果已经确知应用的协议信息,样板代码如下:
1 |
|
关键在于 window.location.href
的值。
那么我们作为一名前端开发者,如何获知某个应用的协议名或者调用参数?
这主要看你用的系统。
Windows
Windows 里自定义协议一般是写在注册表里的,你可以这样找:
1. 用注册表查找
-
按
Win + R
→ 输入regedit
→ 回车。 -
展开路径:
1
HKEY_CLASSES_ROOT
-
在这个目录下,除了常见的
.txt
、.jpg
之类的扩展名,还有一些纯文本的名字(比如zoommtg
、alipay
、myapp
)。 -
找到你怀疑是这个软件的名字的项(例如
steam
、alipay
)。 -
打开它,看看里面有没有:
1
URL Protocol
这个值存在就说明这是一个 URL 协议。
-
继续展开到:
1
HKEY_CLASSES_ROOT\<协议名>\shell\open\command
里面的
(默认)
值会告诉你启动程序的完整路径和参数格式,例如:1
"C:\Program Files\MyApp\myapp.exe" "%1"
%1
就是浏览器传入的 URL,比如myapp://open?file=test.txt
。
2. 用命令行查找
在 PowerShell 里:
1 | Get-ChildItem "Registry::HKEY_CLASSES_ROOT" | |
这会列出所有注册了 URL 协议的名字,你就能快速找到可能的协议名。
macOS
-
打开终端,输入:
1
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -dump
-
输出很长,你可以 grep:
1
lsregister -dump | grep -A 3 'CFBundleURLSchemes'
就会看到所有协议,比如:
1
2
3CFBundleURLSchemes = (
zoommtg
) -
找到协议名后,可以在
/Applications
下找到对应应用,查看Info.plist
文件(里面有 URL 处理规则)。
Linux
-
看本地
.desktop
文件(一般在/usr/share/applications
或~/.local/share/applications
)。 -
用 grep 查找 URL 协议:
1
grep -R "x-scheme-handler" /usr/share/applications ~/.local/share/applications
-
会输出类似:
1
x-scheme-handler/zoommtg=Zoom.desktop
-
打开对应
.desktop
文件,就能看到启动命令和参数。
调用参数的推断
-
如果注册表(或 plist / desktop 文件)里的命令是:
1
"C:\Program Files\MyApp\myapp.exe" "%1"
那
%1
就是完整的 URL(如myapp://something?x=1
)。 -
有些程序会写死格式,比如:
1
"C:\Program Files\Player\player.exe" --play "%1"
那就说明协议调用时会多一个
--play
参数。 -
不清楚参数格式时,可以先手动在浏览器地址栏输入:
1
协议名://
看它的反应,有的会直接弹软件,有的会报错提示缺少参数。
其他通过网页打开应用的可能
文件类型关联(File Association)
原理
-
如果网页提供一个特定扩展名的文件(如
.docx
、.torrent
、.psd
),且用户系统已把这种文件关联到某个本地程序,那么下载后直接“打开”就会调用该程序。 -
这通常需要用户点击下载,并允许浏览器打开文件。
所需条件 / 数据
-
文件扩展名(例如
.pdf
、.torrent
) -
该扩展名在系统中已经关联到本地应用
-
文件内容本身(可能是空壳文件,只要扩展名正确)
浏览器扩展 / 原生消息通信(Native Messaging)
原理
-
安装浏览器扩展(Extension / Add-on),扩展中声明可以与本地软件通信。
-
当网页调用扩展的接口时,扩展可以触发本地应用运行。
所需条件 / 数据
-
浏览器扩展的 ID / API
-
本地安装的“宿主程序”
-
两者之间的通信协议(JSON、命令行参数等)
特殊场景
-
PWA + 协议处理:现代浏览器(Chrome/Edge/Firefox)支持 PWA 注册协议(
navigator.registerProtocolHandler
),但受安全限制多,不能直接调用本地 EXE。 -
企业环境 / 内网应用:可能直接用 ActiveX、IE COM 调用本地程序(现在几乎废弃)。
-
本地 WebSocket / HTTP 服务:本地应用在 127.0.0.1 开个端口,网页直接发请求给它(但浏览器会有限制,需要 CORS 放行)。
应用开发者的角度
那么作为应用开发者,又该怎么做才能保证自己的应用能被网页调用打开?
我们在 windows 桌面新建一个 .reg
文件,内容如下,把路径替换为真实的应用路径即可:
1 | Windows Registry Editor Version 5.00 |
- 标题: 通过网页调用本地应用程序
- 作者: 三葉Leaves
- 创建于 : 2025-08-13 00:00:00
- 更新于 : 2025-08-15 11:23:57
- 链接: https://blog.oksanye.com/dcf3f84ac806/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。