进程间通信(Inter‑Process Communication, IPC)

Tauri 使用 进程间通信(IPC) 来连接:

  • WebView(前端 UI)
  • Rust 核心(后端逻辑)

IPC 是 Web 前端与 Rust 之间唯一的通信桥。 它采用消息传递机制,提供结构化且安全的调用方式。 (v2.tauri.app)


什么是 IPC?

IPC 指从 Web 前端环境(WebView)Rust 核心 发送消息的方式。

前端无法直接调用 Rust 函数,而是通过 IPC 调用 Rust “命令(Commands)”,后者在 Rust 端注册并处理对应行为。

Rust 执行完毕后,可以将结果或事件发送回前端。 (v2.tauri.app)

Web → Rust

注册命令(Register Commands)

要让 Rust 成为可被调用的 IPC 端点,需要在 Rust 端定义命令:

#[tauri::command]
fn greet(name: &str) -> String {
    format!("Hello, {}!", name)
}

命令必须使用:

#[tauri::command]

这个宏会让 Tauri 在编译时生成必要的处理程序。

然后需要将命令添加到构建器:

tauri::Builder::default()
  .invoke_handler(tauri::generate_handler![greet])
  .run(tauri::generate_context!())
  .expect("error while running tauri application");

执行后,Rust 就暴露了 greet 命令供前端调用。 (v2.tauri.app)


调用命令(Invoke Commands)

前端通过 Tauri 提供的 JavaScript API 调用 Rust 命令:

import { invoke } from '@tauri-apps/api/tauri';

await invoke('greet', { name: 'Alice' });

调用说明:

  • 第一个参数是命令名称(字符串)
  • 第二个参数是命令参数对象 → 对应命令函数的参数名(这里是 name

调用后会返回 Rust 函数的返回值。 (v2.tauri.app)


Rust → Web

Rust 也可以主动向 Web 前端发送事件。

发送事件(Emit Events)

Rust 使用 emit_allemit 将事件发送到前端:

window
  .emit_all("status-updated", "ready")
  .unwrap();

在这个示例中:

  • 事件名称是 "status‑updated"
  • 数据是 "ready" → 类型可以是任何可以序列化的数据(例如对象、数组、数字等)。 (v2.tauri.app)

前端监听事件(Listening Events)

前端可以使用 JavaScript API 监听这些事件:

import { listen } from '@tauri-apps/api/event';

const unlisten = await listen('status-updated', event => {
  console.log(`Status: ${event.payload}`);
});

调用说明:

  • listen 会返回一个“取消监听(unlisten)函数”
  • 你可以在任意时候调用它来移除监听器。 (v2.tauri.app)

错误处理(Error Handling)

当前端调用命令出错时:

  • invoke() 会返回一个 rejected Promise
  • 错误信息可以在 .catch() 中捕获

示例:

import { invoke } from '@tauri-apps/api/tauri';

invoke('greet', { name: null })
  .catch(e => {
    console.error('调用错误:', e);
  });

说明:

  • 参数类型错误
  • 命令未注册
  • 命令内部 panic 都将导致调用失败并抛出错误。 (v2.tauri.app)

安全性提示(Security Considerations)

为了保证应用高安全性:

🔒 最小权限原则(Least Privilege)

只注册并暴露真正需要的命令,避免一口气开启大量命令接口。

这不仅减少攻击面,还能:

  • 限制不必要的系统访问
  • 减少暴露风险

🔒 验证参数(Validate Inputs)

在 Rust 命令中严格检查前端传入的参数:

#[tauri::command]
fn set_age(age: u8) -> String {
  if age < 0 || age > 120 {
    return "无效年龄".into();
  }
  format!("设置年龄: {}", age)
}

不要信任来自前端的任何数据。 所有逻辑必须在 Rust 侧进行验证与解析。 (v2.tauri.app)


事件与命令区别总结(Events vs Commands)

交互方式 方向 说明
命令(Commands) Web → Rust 用于调用 Rust 函数并返回结果
事件(Events) Rust → Web Rust 主动通知前端发生的状态变更

总结(Summary)

  1. IPC 是前端与后端通信唯一机制
  2. 定义 Rust 命令来接收前端调用
  3. 前端使用 invoke() 调用命令并等返回结果
  4. Rust 可以 emit 事件,前端可监听
  5. 做好错误处理与安全检查

参考资料