You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过自定义schema实现浏览器唤起Flutter Windows桌面应用

Flutter Windows桌面端自定义Schema唤起(Deep Link)实现方案

实现原理

Windows系统的自定义URI唤起本质是通过注册表注册唯一的协议头,当浏览器或其他应用调用该协议头的链接时,系统会查询注册表对应的可执行文件路径,拉起应用并把完整链接作为参数传递给进程。

步骤1:注册自定义URI协议

你需要向Windows注册表写入你的应用专属协议配置,比如你要使用myapp://作为唤起协议,配置规则如下:

  1. 在注册表HKEY_CLASSES_ROOT下新建项,名称为你的协议名(如myapp)
  2. 该项下添加两个值:
    • 默认值(名称为(Default)):设置为URL:myapp Protocol
    • 新建字符串值URL Protocol,值留空
  3. 在myapp项下依次新建子项shell\open\command
  4. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 22:57:03