/** * 检测是否为Android系统 * @returns {boolean} */ export function android() { return /Android/.test(navigator.userAgent) } /** * 上传图片 * @param {Function} renderFun 回调函数,接收APP传递的access参数 */ export function uploadImgFile(renderFun) { // 设置全局回调函数,供原生App调用 window.renderData = renderFun // iOS平台兼容 window.getIosAccessOriginParam = renderFun try { if (window.FlutterPageControl) { console.log('使用window.FlutterPageControl.postMessage(`uploadImgFile`)') // 直接使用Flutter通道 window.FlutterPageControl.postMessage(`uploadImgFile`) try { if (android()) { 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('getImagePath 方法存在?', typeof window.app.getImagePath) console.debug('getImagePath 是函数?', typeof window.app.getImagePath === 'function') } // 等待Flutter注入完成 const waitForFlutterInterface = () => { let attempts = 0 const maxAttempts = 6000 // 最多等待60秒 const checkInterface = () => { attempts++ console.debug(`尝试第 ${attempts} 次检查Flutter接口...`) if ( window.app && window.app.getImagePath && typeof window.app.getImagePath === 'function' ) { console.debug('Flutter接口检测成功,调用 getImagePath') try { const result = window.app.getImagePath() console.debug('getImagePath 返回结果:', result) renderFun(result) } catch (error) { console.error('调用 getImagePath 出错:', error) } } else if (attempts < maxAttempts) { // 继续等待 setTimeout(checkInterface, 100) } else { console.error('Flutter接口注入超时,使用默认数据') // 使用默认的开发数据 const mockAccess = JSON.stringify({}) 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') // 开发环境可以提供模拟数据 if (process.env.NODE_ENV === 'development') { const mockAccess = JSON.stringify({}) setTimeout(() => renderFun(mockAccess), 100) } } } catch (error) { console.error('Failed to connect to APP:', error) } } else { console.log('window.FlutterPageControl不存在') // 降级处理 const mockAccess = JSON.stringify('') renderFun(mockAccess) } } catch (error) { console.error('调出图片选择界面失败:', error) // 异常情况下的兜底处理 const mockAccess = JSON.stringify('') renderFun(mockAccess) } } /** * 解析APP传递的访问参数 * @param {string} access JSON字符串格式的访问参数 * @returns {Object} 解析后的参数对象 */ export function parseAccessOrigin(access) { try { const accessParam = JSON.parse(access) return { success: true, data: accessParam, } } catch (error) { console.error('Failed to parse access origin:', error) return { success: false, error: 'accessOrigin Error.', data: null, } } }