/** * 环境检测工具类 * 用于检测当前运行环境:微信服务号、浏览器、小程序、App等 */ export interface EnvironmentInfo { isWechat: boolean isMiniprogram: boolean isApp: boolean isBrowser: boolean userAgent: string platform: string isAlipayClient: boolean isDingTalk: boolean } /** * 从 UA-CH 或 UA 推断平台,避免使用已弃用的 navigator.platform */ function getPlatformFromClient(): string { // 优先使用 UA-CH(Chromium 等支持) const navAny = navigator as any const uaData = navAny && navAny.userAgentData const uaDataPlatform = typeof uaData?.platform === 'string' ? uaData.platform : '' const platform = uaDataPlatform || inferPlatformFromUserAgent(navigator.userAgent) return (platform || 'unknown').toLowerCase() } function inferPlatformFromUserAgent(userAgent: string): string { const ua = (userAgent || '').toLowerCase() if (ua.includes('windows')) return 'windows' if (ua.includes('mac os x') || ua.includes('macintosh') || ua.includes('mac os')) return 'macos' if (ua.includes('android')) return 'android' if (ua.includes('iphone') || ua.includes('ipad') || ua.includes('ipod') || ua.includes('ios')) return 'ios' if (ua.includes('cros')) return 'chrome os' if (ua.includes('linux')) return 'linux' return 'unknown' } /** * 检测当前运行环境 */ export function detectEnvironment(): EnvironmentInfo { const userAgent = navigator.userAgent.toLowerCase() const platform = getPlatformFromClient() // 检测微信环境 const isWechat = /micromessenger/i.test(userAgent) // 检测支付宝环境 const isAlipayClient = /alipayclient/i.test(userAgent) // 检测抖音环境 const isDingTalk = /dingtalk/i.test(userAgent) // 检测微信小程序环境 const isMiniprogram = isWechat && /miniprogram/i.test(userAgent) // 检测App环境 - 使用括号明确优先级 const isApp = ( /myapp|customapp|nativeapp/.test(userAgent) || (Object.prototype.hasOwnProperty.call(window, 'webkit') && !!(window as any).webkit?.messageHandlers) ) // 检测浏览器环境 const isBrowser = !isWechat && !isApp return { isWechat, isMiniprogram, isApp, isBrowser, userAgent, platform, isAlipayClient, isDingTalk, } } /** * 获取当前场景类型 */ export function getCurrentScene(): 'wechat' | 'browser' | 'miniprogram' | 'app' | 'unknown' { const env = detectEnvironment() if (env.isMiniprogram) return 'miniprogram' if (env.isWechat) return 'wechat' if (env.isApp) return 'app' if (env.isBrowser) return 'browser' return 'unknown' } /** * 检查是否支持特定功能 */ export function checkFeatureSupport() { const env = detectEnvironment() return { // 摄像头支持 camera: 'mediaDevices' in navigator && 'getUserMedia' in navigator.mediaDevices, // NFC支持 nfc: 'NDEFReader' in window || 'nfc' in navigator, // 文件系统支持 fileSystem: 'showOpenFilePicker' in window, // 振动支持 vibration: 'vibrate' in navigator, // 地理位置支持 geolocation: 'geolocation' in navigator, // 微信JS-SDK支持 wechatJSSDK: env.isWechat && typeof window !== 'undefined' && 'WeixinJSBridge' in window, } }