fix(startup): autostart catch 块缺 return 导致复活主窗口 (#468) (#488)

* fix(startup): autostart catch 块缺 return 导致复活主窗口 (#468)

PR #474 引入的"前端兜底"useEffect 在 webview ready 后读
prefs.startMinimized,true 则跳过 currentWindow.show()。但 catch 块只
console.warn 没有 return,控制流继续走到 show()——等于"prefs 读失败 = 强 show"。
autostart 早期 IPC 抖动时 getSettings() 偶发失败,旧逻辑让用户明明开了
静默启动仍把主窗口弹出来。

修复: catch 块加 return,安全侧默认 = 当作 startMinimized=true 保持隐藏。
宁可让用户从 tray 手动唤起,也不要在 autostart 抖动时强 show 一个白色
/ 透明主窗口。

LSUIElement 不在本 PR 范围: 那是全局 macOS UX 决策,会影响 Finder
双击 / Spotlight / Launchpad 启动场景,应单独 PR + 单独评审。
正确做法是 Rust 端动态切 activationPolicy 而非 plist 静态写死。

Refs #468

* docs(startup): clarify catch rationale + improve warn diagnostics

Both local review and PR-Agent bot flagged the "fallback when settings
read fails" semantic reversal. Re-analysis confirms the change is
correct, but the rationale needs to be explicit in the code:

- Rust `get_settings` signature is `pub fn -> UserPreferences` (not
  Result), so this catch is unreachable from a normal first-launch
  scenario (returns defaults). Only Tauri IPC infrastructure failures
  (e.g. __TAURI_INTERNALS__ not ready during autostart early-mount)
  reach this branch.
- Tray is registered by Rust setup() before webview ready, so it remains
  the universal fallback entry point — no "user locked out" risk.
- Improved console.warn to include err.message for diagnostics, since
  raw err objects serialize as [object Object] in Tauri devtools.

No behavior change; comment + log improvement only.

Refs review of #488

---------

Co-authored-by: baiqing <lbx12309@icloud.com>
This commit is contained in:
TRIPandbaiqing authored and GitHub committed 2026-05-18 19:00:28 +08:00
1 parent 6e55e3059b
commit a1d9549db2
1 file changed
+13 -3
+13 -3
View File
@@ -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;