From c383958a80f50fe791d47620918671346c41bbbe Mon Sep 17 00:00:00 2001 From: tianfeng <769204422@qq.com> Date: Fri, 15 Aug 2025 18:49:36 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=B3=E9=97=AD=E9=A1=B5=E9=9D=A2Flutter?= =?UTF-8?q?=E9=80=9A=E9=81=93=E5=A4=84=E7=90=86=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/MobileHeader.vue | 24 ++++-- src/utils/appBridge.js | 141 ++++++++++++++++++++++++++++++-- src/views/HostCenterView.vue | 102 ++++++++++++++++------- 3 files changed, 226 insertions(+), 41 deletions(-) diff --git a/src/components/MobileHeader.vue b/src/components/MobileHeader.vue index ade3e9c..b052b70 100644 --- a/src/components/MobileHeader.vue +++ b/src/components/MobileHeader.vue @@ -1,6 +1,6 @@ diff --git a/src/utils/appBridge.js b/src/utils/appBridge.js index fc5416b..70d1c07 100644 --- a/src/utils/appBridge.js +++ b/src/utils/appBridge.js @@ -24,7 +24,62 @@ export function android() { * @returns {boolean} */ export function isInApp() { - return !!(window.app || window.webkit) + return !!(window.app || window.webkit || window.FlutterPageControl) +} + +/** + * 关闭当前页面(返回到Flutter上一页) + */ +export function closePage() { + try { + if (window.app && window.app.closePage) { + // 使用注入的方法 + window.app.closePage() + } else if (window.FlutterPageControl) { + // 直接使用Flutter通道 + window.FlutterPageControl.postMessage('close_page') + } else { + // 降级处理:浏览器环境 + if (window.history.length > 1) { + window.history.back() + } else { + window.close() + } + } + } catch (error) { + console.error('关闭页面失败:', error) + // 降级处理 + window.history.back() + } +} + +/** + * 退出APP + */ +export function exitApp() { + try { + if (window.app && window.app.exitApp) { + window.app.exitApp() + } else if (window.FlutterPageControl) { + window.FlutterPageControl.postMessage('exit_app') + } + } catch (error) { + console.error('退出APP失败:', error) + } +} + +/** + * 处理返回按钮逻辑 + * @param {boolean} isHomePage 是否为首页 + */ +export function handleBackButton(isHomePage = false) { + if (isHomePage) { + // 首页返回:关闭页面 + closePage() + } else { + // 非首页:正常返回 + window.history.back() + } } /** @@ -38,6 +93,7 @@ export function connectApplication(renderFun) { try { if (ios()) { + console.debug('ios access detected') // iOS可能需要特殊处理,这里先使用通用方法 if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.getAccessOrigin) { window.webkit.messageHandlers.getAccessOrigin.postMessage({}) @@ -45,11 +101,82 @@ export function connectApplication(renderFun) { renderFun(window.app.getAccessOrigin()) } } else if (android()) { - // Android处理 - if (window.app && window.app.getAccessOrigin) { - renderFun(window.app.getAccessOrigin()) + console.debug('Flutter Android WebView 检测') + console.debug('window.app 对象:', window.app) + + // 检查Flutter注入的接口 + if (window.app) { + console.debug('window.app 的所有方法:') + console.debug(Object.keys(window.app)) + + // 检查具体的方法 + console.debug('getAccessOrigin 方法存在?', typeof window.app.getAccessOrigin) + console.debug('getAccessOrigin 是函数?', typeof window.app.getAccessOrigin === 'function') + } + + // 等待Flutter注入完成 + const waitForFlutterInterface = () => { + let attempts = 0; + const maxAttempts = 50; // 最多等待5秒 + + const checkInterface = () => { + attempts++; + console.debug(`尝试第 ${attempts} 次检查Flutter接口...`) + + if (window.app && window.app.getAccessOrigin && typeof window.app.getAccessOrigin === 'function') { + console.debug('Flutter接口检测成功,调用 getAccessOrigin') + try { + const result = window.app.getAccessOrigin() + console.debug('getAccessOrigin 返回结果:', result) + renderFun(result) + } catch (error) { + console.error('调用 getAccessOrigin 出错:', error) + } + } else if (attempts < maxAttempts) { + // 继续等待 + setTimeout(checkInterface, 100) + } else { + console.error('Flutter接口注入超时,使用默认数据') + // 使用默认的开发数据 + const mockAccess = JSON.stringify({ + 'Authorization': 'Bearer FLUTTER_MOCK_TOKEN', + 'Req-Lang': 'en', + 'Req-App-Intel': 'build=1.0;version=2.1;channel=flutter;Req-Imei=flutter-device', + 'Req-Sys-Origin': 'origin=LIKEI;originChild=LIKEI' + }) + renderFun(mockAccess) + } + } + + checkInterface() + } + + // 如果window.app已存在,直接检查,否则等待 + if (window.app) { + waitForFlutterInterface() + } else { + console.debug('等待Flutter注入window.app...') + // 监听window.app的创建 + let checkCount = 0 + const checkApp = () => { + checkCount++ + if (window.app) { + console.debug('检测到window.app,开始连接') + waitForFlutterInterface() + } else if (checkCount < 50) { + setTimeout(checkApp, 100) + } else { + console.error('等待window.app超时') + // 手动通知Flutter注入接口 + if (window.FlutterApp && window.FlutterApp.postMessage) { + window.FlutterApp.postMessage('requestAccessOrigin') + } + } + } + checkApp() } } else { + console.debug('非移动设备环境') // 非APP环境,可能是浏览器调试 console.warn('Not in APP environment, using mock data for development') // 开发环境可以提供模拟数据 @@ -151,9 +278,9 @@ export function setHttpHeaders(headerInfo) { console.error('Failed to update HTTP headers:', error) }) - console.log('🔑 Authorization token set:', headerInfo.authorization) - console.log('🌍 Language set:', headerInfo.reqLang) - console.log('📱 App info:', { + console.debug('🔑 Authorization token set:', headerInfo.authorization) + console.debug('🌍 Language set:', headerInfo.reqLang) + console.debug('📱 App info:', { version: headerInfo.appVersion, build: headerInfo.buildVersion, channel: headerInfo.appChannel, diff --git a/src/views/HostCenterView.vue b/src/views/HostCenterView.vue index 3d06227..251b46e 100644 --- a/src/views/HostCenterView.vue +++ b/src/views/HostCenterView.vue @@ -1,7 +1,7 @@