fix: 修复最小化到托盘后应用过一段时间自动退出的问题 (#1245)

ExitRequested 事件处理器无条件执行清理并调用 std::process::exit(0),
导致 api.prevent_exit() 被完全抵消。当隐藏窗口的 WebView 被 Windows
后台优化策略回收、窗口对象销毁后,Tauri 运行时检测到无存活窗口自动
触发 ExitRequested,应用随即退出。

通过 ExitRequested 的 code 字段区分两种场景:
- code 为 None(运行时自动触发):仅 prevent_exit(),保持托盘后台运行
- code 为 Some(_)(用户主动 app.exit()):执行清理后退出

Closes #728
This commit is contained in:
YewFence
2026-03-03 16:14:50 +08:00
committed by GitHub
parent c772874dcb
commit af68d4549b
+12 -3
View File
@@ -1094,9 +1094,18 @@ pub fn run() {
app.run(|app_handle, event| {
// 处理退出请求(所有平台)
if let RunEvent::ExitRequested { api, .. } = &event {
log::info!("收到退出请求,开始清理...");
// 阻止立即退出,执行清理
if let RunEvent::ExitRequested { api, code, .. } = &event {
// code 为 None 表示运行时自动触发(如隐藏窗口的 WebView 被回收导致无存活窗口),
// 此时应仅阻止退出、保持托盘后台运行;
// code 为 Some(_) 表示用户主动调用 app.exit() 退出(如托盘菜单"退出"),
// 此时执行清理后退出。
if code.is_none() {
log::info!("运行时触发退出请求(无存活窗口),阻止退出以保持托盘后台运行");
api.prevent_exit();
return;
}
log::info!("收到用户主动退出请求 (code={code:?}),开始清理...");
api.prevent_exit();
let app_handle = app_handle.clone();