From 35e47bf0a1e93f9f9b452c53396f0b1f0361f2da Mon Sep 17 00:00:00 2001 From: stefanfeng Date: Fri, 11 Sep 2026 13:38:20 +0800 Subject: [PATCH] fix(avatar): mark native shell before bridge readiness --- digital-avatar-app/src/utils/uniapp-bridge.ts | 18 ++++++++++++++++-- uniapp-avatar/src/utils/bridge.js | 3 +++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/digital-avatar-app/src/utils/uniapp-bridge.ts b/digital-avatar-app/src/utils/uniapp-bridge.ts index 2c17291..cdf11c3 100644 --- a/digital-avatar-app/src/utils/uniapp-bridge.ts +++ b/digital-avatar-app/src/utils/uniapp-bridge.ts @@ -12,9 +12,10 @@ export interface UniLaunchParams { nickname?: string avatar?: string ts?: string + nativeShell?: string } -const PARAM_KEYS: (keyof UniLaunchParams)[] = ['token', 'userId', 'nickname', 'avatar', 'ts'] +const PARAM_KEYS: (keyof UniLaunchParams)[] = ['token', 'userId', 'nickname', 'avatar', 'ts', 'nativeShell'] function readParams(search: string, target: UniLaunchParams): void { const sp = new URLSearchParams(search) @@ -24,6 +25,16 @@ function readParams(search: string, target: UniLaunchParams): void { } } +function hasNativeShellMarker(): boolean { + const params = getLaunchParams() + if (params.nativeShell === 'uniapp') return true + + // Compatibility for already-installed shells. They have always appended a + // timestamp together with the native SSO context, even before the explicit + // nativeShell marker existed. + return Boolean(params.ts && (params.token || params.userId)) +} + // 是否运行在 uniapp web-view 环境中 export function isInUniWebView(): boolean { const runtime = window as any @@ -40,7 +51,10 @@ export function isInUniWebView(): boolean { runtime.swan?.webView || runtime.tt?.miniProgram ) - return Boolean(runtime.uni?.webView && (isDCloudApp || isMiniProgram)) + // `plus` can be injected after the H5 entry point runs. The native shell + // therefore adds a URL marker while creating its web-view URL, so the + // payment entry does not disappear during that startup window. + return Boolean(runtime.uni?.webView && (isDCloudApp || isMiniProgram || hasNativeShellMarker())) } // 解析 web-view 加载 URL 时原生注入的参数(token / 会会用户) diff --git a/uniapp-avatar/src/utils/bridge.js b/uniapp-avatar/src/utils/bridge.js index 84599c7..88880ec 100644 --- a/uniapp-avatar/src/utils/bridge.js +++ b/uniapp-avatar/src/utils/bridge.js @@ -1,5 +1,8 @@ export function buildH5Url(base, session) { const url = new URL(base) + // This is deliberately explicit instead of relying on the timing of the + // H5+ `plus` injection inside the embedded page. + url.searchParams.set('nativeShell', 'uniapp') if (session.token) url.searchParams.set('token', session.token) if (session.userId) url.searchParams.set('userId', session.userId) if (session.nickname) url.searchParams.set('nickname', session.nickname) -- 2.54.0