Tauri 2.0 插件开发踩坑记录(3)
最近使用 Tauri 2.0
封装 web
前端为 app
时,有个需求就是在 Android
应用内授权安装应用,但是在开发过程中遇到了一些问题,本文将详细介绍这些问题以及解决方案。
假设要开发的插件为: tauri-plugin-android-package-install。
在 TypeScript
的接口定义中就可以以下面的方式进行定义: guest-js/index.ts
:
import { invoke } from "@tauri-apps/api/core";
export async function install(installPath: string): Promise<void> {
await invoke("plugin:android-package-install|install", {
installPath,
});
}
在 Rust
中定义的命令如下:
#[command]
pub(crate) async fn install<R: Runtime>(app: AppHandle<R>, install_path: String) -> Result<()> {
app.android_package_install().install(install_path)
}
在这里就遇到了第一个问题:因为 Rust
中定义的参数名是 install_path
,则 TypeScript
中定义必须使用 installPath
,即 invoke
的 args
参数名必须使用 installPath
,否则会出现以下错误:
Msg: Uncaught (in promise) invalid args `installPath` for command `install`: command install missing required key installPath
代码如下:
// ❌错误
import { invoke } from "@tauri-apps/api/core";
export async function install(install_path: string): Promise<void> {
await invoke("plugin:android-package-install|install", {
install_path,
});
}
// ✅正确
import { invoke } from "@tauri-apps/api/core";
export async function install(installPath: string): Promise<void> {
await invoke("plugin:android-package-install|install", {
installPath,
});
}
// ✅正确
import { invoke } from "@tauri-apps/api/core";
export async function install(install_path: string): Promise<void> {
await invoke("plugin:android-package-install|install", {
installPath: install_path,
});
}
第二个可能遇到的问题是安装问题,即:
FileProvider Issue: Failed to find configured root that contains
需要在 res/xml/file_paths.xml
配置 files-path
,即:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="my_images" path="." />
<cache-path name="my_cache_images" path="." />
<files-path name="apk_files" path="." />
</paths>
具体其它细节就不再赘述了,可以看 tauri-plugin-android-package-install 详细代码。