人人都会AI编程

13.3 自定义协议注册:唤起应用、协议传参

更新时间:2026-07-11

自定义协议(也叫 Deep Link)可以让你的应用像 mailto:slack:// 一样,从网页或其它应用中直接唤起,并附带参数。这对提升用户留存和操作效率非常有帮助——比如从网页的“打开客户端”按钮一键跳转到应用内的对应页面。

Tauri 对自定义协议的支持分为两步:注册协议名称,以及在应用启动(或再次唤起)时解析协议参数。整个过程跨平台且安全,只需少量配置即可生效。


1. 注册自定义协议

tauri.conf.jsonplugins > deep-link 中添加配置(Tauri v2 使用插件体系)。如果没有插件,需要先安装:

npm install @tauri-apps/plugin-deep-link

然后在配置文件中声明协议名称,例如 myapp

{
  "plugins": {
    "deep-link": {
      "desktop": {
        "schemes": ["myapp"]
      }
    }
  }
}

Windows 和 macOS 在打包时会自动注册该协议;Linux 则需要应用在首次运行时调用注册函数,Tauri 会处理好细节。注册后,系统知道所有 myapp:// 的链接都应该交给你的应用处理。


2. 解析协议参数并做页面路由

用户点击 myapp://open?page=dashboard&id=42 这种链接时,Tauri 会将完整的 URL 发送给应用。你可以在初始化的 setup 钩子中监听事件,或者在主进程中接收。

在前端监听(推荐)
安装前端插件并导入监听函数:

npm install @tauri-apps/plugin-deep-link
import { onOpenUrl } from '@tauri-apps/plugin-deep-link';

// 应用已启动后被再次唤起
onOpenUrl((urls) => {
  for (const url of urls) {
    const parsed = new URL(url);
    if (parsed.pathname === 'open') {
      const page = parsed.searchParams.get('page');
      const id = parsed.searchParams.get('id');
      // 根据参数跳转到对应路由
      router.push({ name: page, params: { id } });
    }
  }
});

处理冷启动(应用未打开时通过协议唤起)
Tauri 会把冷启动时的 URL 也放入同一个回调,所以只需统一在 onOpenUrl 中处理即可。不需要额外区分冷热启动,大大简化了逻辑。

在 Rust 后端直接处理(高级)
如果你需要在 Rust 侧做权限校验或预处理,可以在 tauri-plugin-deep-linksetup 中注册闭包:

app.listen("deep-link://new-url", |event| {
    let url = event.payload();
    // 验证域名、提取参数,再通过事件发给前端
});

但通常前端直接解析更简单。


3. 跨平台注意事项

  • macOS:首次打开通过协议唤起的应用时,系统会弹出确认框询问是否允许。确认后,后续操作自动放行。
  • Windows:注册表会自动写入对应键值,卸载应用时 Tauri 的安装器(msi/nsis)会自动清理,避免残留。
  • Linux:依赖 .desktop 文件的 MimeTypex-scheme-handler/ 配置,Tauri 打包工具会自动生成符合规范的条目。

4. 常见问题与最佳实践

  • 协议名的唯一性:建议使用带有明显品牌特征的前缀,例如 mycompany-myapp,避免和系统已有协议冲突。
  • 参数安全性:永远不要盲目信任 URL 中的参数,必要时在 Rust 层做白名单校验,防止恶意链接执行未授权操作。
  • 测试技巧:开发时可以在浏览器地址栏直接输入 myapp://test 进行快速唤起调试(需先安装一次 debug 版本,注册协议)。

通过自定义协议,你的 Tauri 应用就能无缝嵌入用户的日常操作流中——从一封邮件、一个网页、甚至另一个应用里,一键直达目标功能。整个过程配置简洁,且完全遵循各平台的安全策略。