diff --git a/src/components/MiniProgramLauncher/UrlSchemeLauncher.js b/src/components/MiniProgramLauncher/UrlSchemeLauncher.js index 8d618640..11d68d4b 100644 --- a/src/components/MiniProgramLauncher/UrlSchemeLauncher.js +++ b/src/components/MiniProgramLauncher/UrlSchemeLauncher.js @@ -47,6 +47,7 @@ const generatePlainUrlScheme = (path, query) => { * @param {Function} [props.onSuccess] - 跳转成功回调 * @param {Function} [props.onError] - 跳转失败回调 * @param {Object} [props.buttonProps] - 按钮属性 + * @param {Object} [props.buttonStyle] - 按钮内联样式 */ const UrlSchemeLauncher = ({ path = '', @@ -55,6 +56,7 @@ const UrlSchemeLauncher = ({ onSuccess, onError, buttonProps = {}, + buttonStyle = {}, }) => { const [loading, setLoading] = useState(false); const [openlink, setOpenlink] = useState(null); @@ -132,7 +134,7 @@ const UrlSchemeLauncher = ({ // 再次尝试跳转 const handleRetry = useCallback(() => { if (openlink) { - openUrlScheme(openlink); + window.location.href = openlink; } }, [openlink]); @@ -144,6 +146,7 @@ const UrlSchemeLauncher = ({ loadingText="正在跳转..." colorScheme="green" leftIcon={} + style={buttonStyle} {...buttonProps} > {children || '打开小程序'} diff --git a/src/components/MiniProgramLauncher/hooks/useWechatEnvironment.js b/src/components/MiniProgramLauncher/hooks/useWechatEnvironment.js index 8cdac68a..a5316455 100644 --- a/src/components/MiniProgramLauncher/hooks/useWechatEnvironment.js +++ b/src/components/MiniProgramLauncher/hooks/useWechatEnvironment.js @@ -24,11 +24,35 @@ export const isWeChatBrowser = () => { /** * 检测是否为移动端设备 + * 使用多种检测方式,确保 Safari 兼容性 */ export const isMobileDevice = () => { if (typeof window === 'undefined') return false; + const ua = navigator.userAgent; - return /iPhone|iPad|iPod|Android|webOS|BlackBerry|IEMobile|Opera Mini/i.test(ua); + + // 方式1:User Agent 检测 + const uaCheck = /iPhone|iPad|iPod|Android|webOS|BlackBerry|IEMobile|Opera Mini/i.test(ua); + + // 方式2:触摸屏检测(Safari 兼容) + const touchCheck = 'ontouchstart' in window || navigator.maxTouchPoints > 0; + + // 方式3:屏幕宽度检测(作为备用) + const screenCheck = window.innerWidth <= 768; + + // 方式4:Safari 特定检测(iOS Safari 不会在 UA 中包含 "Mobile" 但会有 "Safari") + const isSafariMobile = /Safari/i.test(ua) && /Apple/i.test(navigator.vendor) && touchCheck; + + const result = uaCheck || (touchCheck && screenCheck) || isSafariMobile; + + // 调试日志(仅在开发环境) + if (process.env.NODE_ENV === 'development') { + console.log('[isMobileDevice] UA:', ua); + console.log('[isMobileDevice] uaCheck:', uaCheck, 'touchCheck:', touchCheck, 'screenCheck:', screenCheck, 'isSafariMobile:', isSafariMobile); + console.log('[isMobileDevice] result:', result); + } + + return result; }; /** diff --git a/src/components/MiniProgramLauncher/index.js b/src/components/MiniProgramLauncher/index.js index cfd6a56f..f0cfc7f5 100644 --- a/src/components/MiniProgramLauncher/index.js +++ b/src/components/MiniProgramLauncher/index.js @@ -82,6 +82,7 @@ const MiniProgramLauncher = ({ onSuccess={onSuccess} onError={onError} buttonProps={buttonProps} + buttonStyle={buttonStyle} > {children}