最近在尝试使用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并且响应了。