我使用Tauri deep-link插件踩过的坑

最近在尝试使用Deep Linking | Tauri来实现应用登录,但是浏览器输入自定义url,却触发不了app。

这个插件非常的新,网络上几乎都搜不到什么资料,这里面的坑还是挺多的。

Dev模式下url无法触发的问题

首先,deep-link需要配合single instance插件来实现,否则每次打开url都会启动一个新的实例。

因此你需要先在项目中添加single instance插件Single Instance | Tauri,然后执行

bash 复制代码
yarn tauri build

构建出一个安装包,然后在你的电脑上安装之后,再使用yarn tauri dev就可以注册自定义url了。

但是之后又遇到了另外的问题,即使这样执行了之后,还是无法触发自定义url,在GitHub issues里也找到了类似的问题。

[bug] Register deep-link with single instance not working. · Issue #12726 · tauri-apps/tauri

后续首先尝试了在tauri.conf.json中添加schemes

json 复制代码
{
  "plugins": {
    "deep-link": {
      "mobile": [
        { "host": "your.website.com", "pathPrefix": ["/open"] },
        { "host": "another.site.br" }
      ],
      "desktop": {
        "schemes": ["something", "my-tauri-app"]
      }
    }
  }
}

然后在main函数中执行注册所有scheme,但是还是没法触发。

rust 复制代码
 use tauri_plugin_deep_link::DeepLinkExt;
  app.deep_link().register_all()?;

main函数初始化隐藏的坑

最后发现是main函数的锅,由于我们项目在main函数 tauri::Builder::default() 执行之前做了一些初始化的动作,single instance在初始化完成后才开始起效,所以相当于还是启动了两个实例。

解决方法:一定要把tauri::Builder::default()放到main函数的第一行执行,然后立刻注册single instance插件,否则single instance会出现问题。

最后我们的解决方案就是,把single instance放到main函数最前面,然后将项目的初始化放到了setup函数中,这样deep link就可以正常触发了。

rust 复制代码
fn main() {
    tauri::Builder::default()
        .plugin(tauri_plugin_single_instance::init(|app, argv, cwd| {
            println!("{}, {argv:?}, {cwd}", app.package_info().name);
        }))
        .plugin(tauri_plugin_updater::Builder::new().build())
        .plugin(tauri_plugin_os::init())
        .plugin(tauri_plugin_deep_link::init())
        .plugin(tauri_plugin_notification::init())
        .plugin(tauri_plugin_dialog::init())
        .plugin(tauri_plugin_shell::init())
        .plugin(tauri_plugin_process::init())
        .plugin(
            tauri_plugin_prevent_default::Builder::new()
                .with_flags(
                    Flags::FIND
                        | Flags::CARET_BROWSING
                        | Flags::OPEN
                        | Flags::PRINT
                        | Flags::DOWNLOADS,
                )
                .build(),
        )
        .setup(move |app| {
            if cfg!(debug_assertions) {
                use tauri_plugin_deep_link::DeepLinkExt;
                app.deep_link().register_all()?;
            }
        }
}

这样打包出来的app就可以正常注册url并且响应了。

相关推荐
数据知道14 小时前
claw-code 源码分析:从 TypeScript 心智到 Python/Rust——跨栈移植时类型、边界与错误模型怎么对齐?
python·ai·rust·typescript·claude code·claw code
Rust研习社1 天前
深入浅出 Rust 迭代器:从基础用法到性能优化
rust
@atweiwei1 天前
langchainrust:Rust 版 LangChain 框架(LLM+Agent+RAG)
开发语言·rust·langchain·agent·向量数据库·rag
skilllite作者1 天前
自进化 Agent 的 skills 别长成烟囱:从多入口分叉到统一发现与 spec 防火带
人工智能·算法·rust·openclaw·agentskills
Rust研习社1 天前
关于 Rust Option 的那些事:从基础到常用 API 全解析
rust
爱分享的阿Q2 天前
Rust加WebAssembly前端性能革命实践指南
前端·rust·wasm
沉淀粉条形变量2 天前
rust 单例模式
开发语言·单例模式·rust
skilllite作者2 天前
SkillLite 多入口架构实战:CLI / Python SDK / MCP / Desktop / Swarm 一页理清
开发语言·人工智能·python·安全·架构·rust·agentskills
Rust研习社2 天前
深入理解 Rust 闭包:从基础语法到实战应用
rust
Rust研习社2 天前
Rust 时间处理神器:chrono 从入门到实战
rust