修复桌面壳正式包浏览器误开

release 内部 tauri.localhost 资源留在 WebView 内加载

Windows 正式包切换 GUI 子系统避免弹出控制台

补充桌面壳 release 导航回归测试和共享记忆
This commit is contained in:
2026-06-22 14:25:42 +08:00
parent f0b9f3f5c2
commit 58ede89341
5 changed files with 32 additions and 2 deletions
@@ -51,6 +51,13 @@ const appPath = new URL('../src-tauri/src/app.rs', import.meta.url);
const app = fs.readFileSync(appPath, 'utf8');
const mainPath = new URL('../src-tauri/src/main.rs', import.meta.url);
const main = fs.readFileSync(mainPath, 'utf8');
if (
!main.includes(
'#![cfg_attr(all(not(dev), target_os = "windows"), windows_subsystem = "windows")]',
)
) {
throw new Error('desktop shell release builds on Windows must use the GUI subsystem');
}
const rustSourceDir = new URL('../src-tauri/src/', import.meta.url);
const desktopHostBridgeAppearancePath = new URL(
'../src-tauri/src/host_bridge/appearance.rs',
@@ -2791,8 +2798,10 @@ const requiredRustHostSnippets = [
'path.contains("bridgeVersion=")',
'path.contains("hostCapabilities=")',
'should_allow_desktop_webview_navigation',
'matches!(url.scheme(), "http" | "https")',
'url.host_str() == Some("127.0.0.1")',
'url.port_or_known_default() == Some(3000)',
'Url::parse("http://tauri.localhost/index.html")',
'Url::parse("http://127.0.0.1:3000/works/detail?work=PZ-1")',
'desktop_external_navigation_url',
'open_normalized_desktop_external_url',
+2
View File
@@ -1,3 +1,5 @@
#![cfg_attr(all(not(dev), target_os = "windows"), windows_subsystem = "windows")]
mod app;
mod host_bridge;
mod shell;
@@ -122,7 +122,7 @@ fn is_desktop_packaged_asset_url(url: &Url) -> bool {
return true;
}
url.scheme() == "https"
matches!(url.scheme(), "http" | "https")
&& url
.host_str()
.map(|host| host.ends_with(".localhost"))
@@ -253,6 +253,16 @@ mod tests {
));
assert_eq!(desktop_external_navigation_url(&windows_packaged_url), None);
let windows_http_packaged_url =
Url::parse("http://tauri.localhost/index.html").expect("windows http packaged url");
assert!(should_allow_desktop_webview_navigation(
&windows_http_packaged_url
));
assert_eq!(
desktop_external_navigation_url(&windows_http_packaged_url),
None
);
let same_origin_url = Url::parse("https://app.genarrative.world/works/detail?work=PZ-1")
.expect("same-origin url");
assert!(should_allow_desktop_webview_navigation(&same_origin_url));
@@ -3269,5 +3269,6 @@
- 背景:`npm run desktop-shell:dev` 通过 Tauri `devUrl` 固定加载 `http://127.0.0.1:3000/`,但 Linux dev 端口段逻辑会把未显式指定的 `dev:web` 主站端口映射到用户端口段,例如 `10000+`。只在桌面壳 package script 里设置 `WEB_PORT=3000` 不会让 `scripts/dev.mjs` 把 Web 端口视为显式 CLI 参数,结果 Tauri 仍打开 3000,而 Vite 实际监听其它端口。
- 决策:桌面壳 `beforeDevCommand` 必须执行 `npm --prefix ../.. run dev:web -- --web-port 3000 --strict-web-port`,用 CLI 参数锁定主站 Vite 端口并禁止静默漂移;`devUrl` 继续固定 `http://127.0.0.1:3000/`。如果 3000 被占用,应该释放端口后再启动桌面壳,而不是让 Vite 漂移后继续由 Tauri 加载旧端口。由于主窗口设置了 `create=false` 并由 Rust 手动创建,`app.rs` 在 dev build 下必须把主窗口 URL 替换为 `build.devUrl` 后再补写 HostBridge queryrelease 仍从 `index.html` 打包资源进入。
- 2026-06-22 调整:release 打包资源在 Windows WebView 内可能以 `http://tauri.localhost/index.html` 出现,这仍是 Tauri 内部资源,不允许被导航拦截交给系统浏览器;`shell/navigation.rs` 必须允许 `http` / `https``*.localhost` 留在 WebView。Windows release 二进制必须使用 GUI subsystem,避免正式包启动时额外弹出控制台窗口。
- 影响范围:`apps/desktop-shell/src-tauri/tauri.conf.json``apps/desktop-shell/scripts/check-config.mjs``scripts/dev.test.ts`、Expo / Tauri HostBridge 方案文档。
- 验证方式:`npm run test -- scripts/dev.test.ts -t "Linux 桌面壳显式指定 web-port"``cargo test --manifest-path apps/desktop-shell/src-tauri/Cargo.toml desktop_main_window_config_uses_dev_url_in_dev_builds``npm run desktop-shell:typecheck``npm run check:native-shells``npm run check:encoding``git diff --check`
- 验证方式:`npm run test -- scripts/dev.test.ts -t "Linux 桌面壳显式指定 web-port"``cargo test --manifest-path apps/desktop-shell/src-tauri/Cargo.toml desktop_main_window_config_uses_dev_url_in_dev_builds desktop_webview_navigation_stays_on_packaged_or_same_origin_pages``npm run desktop-shell:typecheck``npm run check:native-shells``npm run check:encoding``git diff --check`
@@ -2214,6 +2214,14 @@
- 验证:`cargo test --manifest-path apps/desktop-shell/src-tauri/Cargo.toml desktop_main_window_config_uses_dev_url_in_dev_builds desktop_webview_navigation_stays_on_packaged_or_same_origin_pages`,实际启动时窗口应加载 `http://127.0.0.1:3000/...` 而不是 `tauri.localhost/index.html`
- 关联:`apps/desktop-shell/src-tauri/src/app.rs``apps/desktop-shell/src-tauri/src/shell/url.rs``apps/desktop-shell/src-tauri/src/shell/navigation.rs``apps/desktop-shell/src-tauri/tauri.conf.json`
## Tauri release 的 tauri.localhost 不要交给系统浏览器
- 现象:Windows / release 包启动桌面壳时,系统默认浏览器被打开到 `http://tauri.localhost/index.html`
- 原因:release 打包资源在 WebView 内可能表现为 `tauri://localhost/index.html``https://tauri.localhost/index.html``http://tauri.localhost/index.html`;如果导航白名单只允许 `tauri:``https://*.localhost``http://tauri.localhost` 会被误判成普通外链并交给 `opener.open_url`
- 处理:桌面壳导航策略必须把 `http` / `https``*.localhost` 都视为 Tauri 内部打包资源,只允许真正外部 `http` / `https``mailto``tel` 走系统浏览器。Windows release 入口还必须使用 `windows_subsystem = "windows"`,避免正式包额外弹出控制台窗口;dev build 保留控制台日志。
- 验证:`cargo test --manifest-path apps/desktop-shell/src-tauri/Cargo.toml desktop_webview_navigation_stays_on_packaged_or_same_origin_pages``npm run desktop-shell:typecheck`、Windows release 启动时不应打开系统浏览器或控制台窗口。
- 关联:`apps/desktop-shell/src-tauri/src/main.rs``apps/desktop-shell/src-tauri/src/shell/navigation.rs``apps/desktop-shell/scripts/check-config.mjs`
## 自动试玩退出不要回到生成页
- 现象:拼图草稿生成完成后自动进入试玩,用户从试玩退出或使用系统返回时落回生成进度页,页面还暴露“重新生成”按钮。