00 / 00

Runtime 与权限

理解 Tauri commands、capabilities、plugin、浏览器 fallback 和系统权限

Tauri 应用由两部分组成:前端 WebView 和 Rust 原生 runtime。前端负责界面,Rust 负责系统能力。两边通过 Tauri command 或 plugin 通信。

为什么要有 runtime adapter

模板把所有 Tauri 相关调用放在:

products/01mvp/apps/desktop/src/runtime

这样做有三个好处:

  • React 组件不会到处散落 invoke 和 plugin import
  • 浏览器预览能用 fallback 调 UI
  • 新增系统能力时有统一的测试和排查入口

当前 runtime adapter

文件能力
core.ts判断是否运行在 Tauri、封装 invoke 和可选 plugin import
preferences.ts读取、保存、重置本地偏好
app-info.ts读取应用名、版本和 identifier
opener.ts打开外部 URL 或 app data 目录
updater.ts预留自动更新检查入口

浏览器预览没有真实 Tauri runtime。模板会返回 unavailable 状态,或使用 localStorage 保存临时偏好。

Rust commands

Rust command 在:

products/01mvp/apps/desktop/src-tauri/src/lib.rs

当前命令包括:

get_desktop_preferences
set_desktop_preferences
reset_desktop_preferences
open_app_data_dir

前端通过 invokeTauri() 调用这些命令。新增命令后,要记得加入:

.invoke_handler(tauri::generate_handler![
    get_desktop_preferences,
    open_app_data_dir,
    reset_desktop_preferences,
    set_desktop_preferences
])

Capabilities

Tauri v2 用 capabilities 控制前端能调用哪些命令和 plugin。配置在:

products/01mvp/apps/desktop/src-tauri/capabilities/default.json

当前模板只开放:

{
  "permissions": ["core:default", "opener:default", "process:default"]
}

新增 plugin 时,只开放产品真正需要的权限。比如你只需要检查更新,就优先使用 updater 的 check 权限,不要直接开放完整安装流程。

官方文档:Tauri permissions

Plugin 怎么加

新增一个 Tauri plugin 通常要改三处:

  1. products/01mvp/apps/desktop/package.json 添加 JS plugin。
  2. products/01mvp/apps/desktop/src-tauri/Cargo.toml 添加 Rust plugin。
  3. src-tauri/src/lib.rs 注册 plugin,并在 capabilities 里开放权限。

前端使用时,不要在组件里直接 import plugin。先在 src/runtime/<feature>.ts 封装。

系统权限

有些能力不是 Tauri capabilities 能完全决定的。操作系统还会要求用户授权。

能力可能涉及的系统权限
麦克风macOS Microphone、Windows privacy setting
截屏macOS Screen Recording
全局快捷键或输入监听macOS Accessibility / Input Monitoring
自动粘贴或控制其他 AppmacOS Automation / Accessibility
读取任意文件文件选择器或文件系统权限

模板默认不启用这些能力。具体产品需要时,再按产品场景添加权限说明、检测状态和用户引导。

新增系统能力的推荐流程

  1. 先写清楚这个能力为什么需要原生 runtime。
  2. 选择官方 plugin 或成熟 plugin,避免手写平台底层逻辑。
  3. 在 Rust 侧注册 plugin 或 command。
  4. 在 capabilities 里只开放必要权限。
  5. src/runtime 封装 adapter,并提供浏览器 fallback。
  6. 在 UI 里展示可理解的不可用状态。
  7. 在 Tauri 原生窗口里验收,不只看浏览器预览。

不要把浏览器 smoke 当成 native 验收

浏览器预览能证明布局、普通 React 状态和 HTTP API。它不能证明:

  • Tauri command 能调用
  • app data 目录能写入
  • tray 能出现
  • 系统权限能弹窗
  • 签名后的 app 能被系统识别

涉及原生能力时,至少跑:

vpr @01mvp/desktop#tauri:dev

再跑 Rust 检查:

vpr @01mvp/desktop#tauri:check

这篇文档有问题?