记录桌面壳生命周期状态读取失败

桌面生命周期窗口状态读取失败时记录具体字段并使用保守默认值

桌面壳配置检查拒绝窗口状态读取静默兜底

共享决策日志补充生命周期读取失败边界
This commit is contained in:
2026-06-20 09:50:51 +08:00
parent 88d278122e
commit 328bf920bd
3 changed files with 52 additions and 6 deletions
+8 -3
View File
@@ -2253,7 +2253,9 @@ const requiredRustHostSnippets = [
'WindowEvent::Focused',
'WindowEvent::Resized',
'resolve_desktop_lifecycle_payload',
'resolve_desktop_lifecycle_window_flag',
'emit_current_desktop_lifecycle_event',
'desktop_lifecycle_window_flag_logs_failure_and_uses_default',
'"background"',
'"hidden"',
'"minimized"',
@@ -2273,9 +2275,9 @@ const requiredRustHostSnippets = [
'PageLoadEvent::Finished',
'replay_desktop_webview_state',
'log_desktop_host_event_result',
'window.is_focused()',
'window.is_visible()',
'window.is_minimized()',
'resolve_desktop_lifecycle_window_flag("visible",',
'resolve_desktop_lifecycle_window_flag("minimized",',
'resolve_desktop_lifecycle_window_flag(\n "focused",',
'resolve_desktop_network_status',
'network.statusChanged',
'register_desktop_navigation_events',
@@ -2786,6 +2788,9 @@ for (const blockedLifecycleSnippet of [
'let _ = emit_current_desktop_lifecycle_event(window)',
'let _ = emit_current_desktop_lifecycle_event(&lifecycle_window)',
'let _ = emit_desktop_image_drop_event(&drop_window',
'window.is_visible().unwrap_or(',
'window.is_minimized().unwrap_or(',
'window.is_focused().unwrap_or(',
'let _ = app.deep_link().register_all()',
'let _ = window.navigate(target_url)',
'let _ = show_main_window(window.app_handle())',
@@ -74,10 +74,30 @@ pub(crate) fn emit_desktop_lifecycle_payload(
emit_desktop_lifecycle_event(window, payload.state, payload.focused, payload.native_state)
}
fn resolve_desktop_lifecycle_window_flag(
label: &'static str,
result: tauri::Result<bool>,
default_value: bool,
) -> bool {
match result {
Ok(value) => value,
Err(error) => {
eprintln!("desktop host event failed for app.lifecycle.{label}: {error}");
default_value
}
}
}
pub(crate) fn emit_current_desktop_lifecycle_event(window: &WebviewWindow) -> tauri::Result<()> {
let visible = window.is_visible().unwrap_or(true);
let minimized = window.is_minimized().unwrap_or(false);
let focused = window.is_focused().unwrap_or(visible && !minimized);
let visible =
resolve_desktop_lifecycle_window_flag("visible", window.is_visible(), true);
let minimized =
resolve_desktop_lifecycle_window_flag("minimized", window.is_minimized(), false);
let focused = resolve_desktop_lifecycle_window_flag(
"focused",
window.is_focused(),
visible && !minimized,
);
emit_desktop_lifecycle_payload(
window,
resolve_desktop_lifecycle_payload(focused, visible, minimized),
@@ -151,6 +171,20 @@ mod tests {
));
}
#[test]
fn desktop_lifecycle_window_flag_logs_failure_and_uses_default() {
assert!(resolve_desktop_lifecycle_window_flag(
"visible",
Ok(true),
false
));
assert!(!resolve_desktop_lifecycle_window_flag(
"focused",
Err(tauri::Error::WindowNotFound),
false
));
}
#[test]
fn desktop_lifecycle_payload_maps_hidden_and_minimized_to_background() {
assert_eq!(
@@ -2902,6 +2902,13 @@
- 影响范围:`apps/desktop-shell/src-tauri/src/shell/deep_link.rs``apps/desktop-shell/scripts/check-config.mjs`
- 验证方式:`cargo test --manifest-path apps/desktop-shell/src-tauri/Cargo.toml shell::deep_link``npm run desktop-shell:typecheck``npm run check:native-shells``npm run check:encoding``git diff --check`
## 2026-06-20 桌面壳生命周期窗口状态读取失败不可静默
- 背景:Tauri 桌面壳 `app.lifecycle` 事件会驱动 H5 游戏循环、背景音乐和固定玩法音频暂停 / 恢复;如果 `is_visible()``is_minimized()``is_focused()` 读取失败后静默使用默认值,生命周期状态可能错误且难以排查。
- 决策:`emit_current_desktop_lifecycle_event(...)` 必须通过 `resolve_desktop_lifecycle_window_flag(...)` 读取窗口可见、最小化和焦点状态;读取失败时记录 `desktop host event failed for app.lifecycle.<field>`,再使用保守默认值。桌面壳配置检查拒绝重新出现 `window.is_visible().unwrap_or(...)``window.is_minimized().unwrap_or(...)``window.is_focused().unwrap_or(...)`
- 影响范围:`apps/desktop-shell/src-tauri/src/shell/lifecycle.rs``apps/desktop-shell/scripts/check-config.mjs`
- 验证方式:`cargo test --manifest-path apps/desktop-shell/src-tauri/Cargo.toml shell::lifecycle``npm run desktop-shell:typecheck``npm run check:native-shells``npm run check:encoding``git diff --check`
## 2026-06-20 移动壳 EAS 原生包构建 profile
- 背景:移动壳已能通过 Expo managed config 和 Metro production bundle smoke,但缺少原生安装包构建 profile;如果只保留 `expo export`,无法证明 Android / iOS 壳有进入原生分发链路的配置。