如何通过自定义schema实现浏览器唤起Flutter Windows桌面应用
Flutter Windows桌面端自定义Schema唤起(Deep Link)实现方案
实现原理
Windows系统的自定义URI唤起本质是通过注册表注册唯一的协议头,当浏览器或其他应用调用该协议头的链接时,系统会查询注册表对应的可执行文件路径,拉起应用并把完整链接作为参数传递给进程。
步骤1:注册自定义URI协议
你需要向Windows注册表写入你的应用专属协议配置,比如你要使用myapp://作为唤起协议,配置规则如下:
- 在注册表
HKEY_CLASSES_ROOT下新建项,名称为你的协议名(如myapp) - 该项下添加两个值:
- 默认值(名称为
(Default)):设置为URL:myapp Protocol - 新建字符串值
URL Protocol,值留空
- 默认值(名称为
- 在
myapp项下依次新建子项shell\open\command command项的默认值设置为你的应用exe完整路径,末尾加"%1"用来接收传递的参数,示例:"C:\Program Files\你的应用名称\app.exe" "%1"
生产环境建议把注册表写入逻辑放到安装包脚本中,比如用Inno Setup打包时可以直接在脚本里添加注册表写入配置,不需要用户手动修改。
步骤2:Flutter应用层接收唤起参数
2.1 启动参数获取
Windows唤起应用时会把完整的schema链接作为命令行参数传递给exe进程,你可以直接在Flutter层通过如下方式获取启动参数:
import 'dart:io'; void main(List<String> args) { // args就是进程的命令行参数,如果是通过schema唤起的,args里会包含完整的链接,比如myapp://detail?id=123 if (args.isNotEmpty) { String deepLink = args.first; // 解析deepLink,做对应的路由跳转等逻辑 } runApp(MyApp()); }
2.2 处理应用已启动的场景
默认情况下每次唤起都会新开一个应用进程,如果要实现已启动时窗口前置+接收新参数,需要额外实现两个能力:
- 应用单实例运行:启动时检测是否已经有同应用进程在运行,有就直接退出新进程,把参数传给老进程
- 进程间通信:新进程把唤起的链接参数通过Windows消息、命名管道等方式传递给已运行的老进程,老进程收到后做对应的逻辑处理,同时把窗口前置最大化
常见注意事项
- 自定义协议名不要和系统或其他常用应用的协议冲突,避免唤起错误应用
- 写入注册表需要管理员权限,打包安装包时要申请对应权限,否则会注册失败
- 解析中文参数时注意编码转换,Windows默认命令行编码是GBK,需要转成UTF-8再传递给Flutter层避免乱码
- 可以在应用每次启动时校验注册表配置是否存在,如果不存在可以提示用户或者申请权限重新写入,避免功能失效
内容的提问来源于stack exchange,提问作者amir_a14
相关产品推荐
相关产品推荐

