/** * H5 上 uni.navigateBack 偶发既不成功也不进 fail;离开 OA web-view 时做兜底。 * @param {{ fallbackUrl?: string, onStuck?: () => void }} [opts] */ export function navigateBackFromOaHost(opts) { const onStuck = opts && opts.onStuck const currentRoute = () => { try { const pages = getCurrentPages() const cur = pages && pages[pages.length - 1] return String((cur && (cur.route || (cur.$page && cur.$page.fullPath))) || '') } catch (_) { return '' } } const stillOnWebview = () => { const route = currentRoute() return ( route.indexOf('oa/start/webview') !== -1 || route.indexOf('oa/webview/') !== -1 ) } const resolveFallbackUrl = () => { const explicit = String((opts && opts.fallbackUrl) || '').trim() if (explicit) return explicit try { const pages = getCurrentPages() if (pages && pages.length >= 2) { const prev = pages[pages.length - 2] const route = prev && prev.route if (route) return '/' + String(route).replace(/^\//, '') } } catch (_) { /* ignore */ } return '/pages/oa/start/index' } const fallback = () => { const fallbackUrl = resolveFallbackUrl() if (!fallbackUrl) { if (onStuck) onStuck() return } uni.redirectTo({ url: fallbackUrl, fail: () => { uni.reLaunch({ url: fallbackUrl, fail: () => { if (onStuck) onStuck() } }) } }) } try { const pages = getCurrentPages() if (pages && pages.length > 1) { uni.navigateBack({ delta: 1, fail: () => fallback() }) // H5:navigateBack 偶发静默失败 setTimeout(() => { if (stillOnWebview()) fallback() }, 280) return } } catch (_) { /* fall through */ } fallback() }