diff --git a/openless-all/app/src/App.tsx b/openless-all/app/src/App.tsx index 40231e5b..08ce2665 100644 --- a/openless-all/app/src/App.tsx +++ b/openless-all/app/src/App.tsx @@ -53,9 +53,19 @@ export function App({ isCapsule, isQa }: AppProps) { const prefs = await getSettings(); if (prefs.startMinimized) return; } catch (err) { - // 读 prefs 失败兜底走原有 show 行为:让权限探测失败的用户也能进 UI, - // 避免透明 / 空白窗口前卡死(issue #163 引入这个 show 的原始意图)。 - console.warn('[startup] read startMinimized failed, falling back to show', err); + // 安全侧默认 = 不弹窗。Rust 端 get_settings 签名是 + // `pub fn get_settings(...) -> UserPreferences`(非 Result),所以 + // 该 catch 唯一会被触发的场景是 Tauri IPC 基础设施抖动(autostart 早期 + // __TAURI_INTERNALS__ 还没就绪)。旧逻辑 fall-through to show 会在用户 + // 开了静默启动时仍把主窗口弹出来 —— #468 复现路径。 + // + // 此时 tray 已由 Rust 端 setup() 在 webview 加载前注册完成,是稳定的 + // 兜底入口;宁可让用户从 tray 手动唤起,也不要在抖动时强 show 一个白色 + // / 透明主窗口。首次安装的"prefs 不存在"场景不走这里 —— Rust 端会返回 + // 默认 UserPreferences。 + const detail = err instanceof Error ? err.message : String(err); + console.warn('[startup] read startMinimized failed; staying hidden to avoid #468:', detail, err); + return; } const { getCurrentWindow } = await import('@tauri-apps/api/window'); if (cancelled) return;