Tauri 2.0 插件开发踩坑记录(3)

tauri2, coding

最近使用 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,即 invokeargs 参数名必须使用 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 详细代码。




参考文档 #