/** * 系统信息工具类 * 使用新API替换废弃的wx.getSystemInfoSync */ class SystemInfoHelper { constructor() { this.cachedInfo = null; this.cacheTime = 0; this.cacheExpiry = 5 * 60 * 1000; // 5分钟缓存 } /** * 获取完整的系统信息(新API版本) */ async getSystemInfo() { // 检查缓存 if (this.cachedInfo && (Date.now() - this.cacheTime) < this.cacheExpiry) { return this.cachedInfo; } try { // 并行获取各种系统信息 const [windowInfo, deviceInfo, appBaseInfo] = await Promise.all([ this.getWindowInfo(), this.getDeviceInfo(), this.getAppBaseInfo() ]); // 🔥 合并所有信息 - 使用Object.assign替代扩展运算符,避免Babel依赖问题 const systemInfo = Object.assign({}, windowInfo, deviceInfo, appBaseInfo, { // 保持向后兼容的字段名 windowHeight: windowInfo.windowHeight, windowWidth: windowInfo.windowWidth, statusBarHeight: windowInfo.statusBarHeight, safeArea: windowInfo.safeArea, platform: deviceInfo.platform, system: deviceInfo.system, model: deviceInfo.model, brand: deviceInfo.brand, version: appBaseInfo.version, SDKVersion: appBaseInfo.SDKVersion, language: appBaseInfo.language, theme: appBaseInfo.theme }); // 缓存结果 this.cachedInfo = systemInfo; this.cacheTime = Date.now(); return systemInfo; } catch (error) { console.warn('获取系统信息失败,使用兜底方案:', error); return this.getFallbackSystemInfo(); } } /** * 同步获取系统信息(用于替换wx.getSystemInfoSync) */ getSystemInfoSync() { // 如果有缓存,直接返回 if (this.cachedInfo && (Date.now() - this.cacheTime) < this.cacheExpiry) { return this.cachedInfo; } try { // 尝试使用新的同步API const windowInfo = wx.getWindowInfo(); const deviceInfo = wx.getDeviceInfo(); const appBaseInfo = wx.getAppBaseInfo(); const systemInfo = { ...windowInfo, ...deviceInfo, ...appBaseInfo, // 保持向后兼容 windowHeight: windowInfo.windowHeight, windowWidth: windowInfo.windowWidth, statusBarHeight: windowInfo.statusBarHeight, safeArea: windowInfo.safeArea, platform: deviceInfo.platform, system: deviceInfo.system, model: deviceInfo.model, brand: deviceInfo.brand, version: appBaseInfo.version, SDKVersion: appBaseInfo.SDKVersion, language: appBaseInfo.language, theme: appBaseInfo.theme }; // 缓存结果 this.cachedInfo = systemInfo; this.cacheTime = Date.now(); return systemInfo; } catch (error) { console.warn('新API获取系统信息失败,使用兜底方案:', error); return this.getFallbackSystemInfo(); } } /** * 获取窗口信息 */ getWindowInfo() { return new Promise((resolve) => { try { const windowInfo = wx.getWindowInfo(); resolve(windowInfo); } catch (error) { console.warn('获取窗口信息失败:', error); resolve({ windowHeight: 667, windowWidth: 375, statusBarHeight: 44, safeArea: { top: 44, bottom: 667 } }); } }); } /** * 获取设备信息 */ getDeviceInfo() { return new Promise((resolve) => { try { const deviceInfo = wx.getDeviceInfo(); resolve(deviceInfo); } catch (error) { console.warn('获取设备信息失败:', error); resolve({ platform: 'unknown', system: 'unknown', model: 'unknown', brand: 'unknown', benchmarkLevel: 1 }); } }); } /** * 获取应用基础信息 */ getAppBaseInfo() { return new Promise((resolve) => { try { const appBaseInfo = wx.getAppBaseInfo(); resolve(appBaseInfo); } catch (error) { console.warn('获取应用信息失败:', error); resolve({ version: '1.0.0', SDKVersion: '2.0.0', language: 'zh_CN', theme: 'light' }); } }); } /** * 兜底系统信息 */ getFallbackSystemInfo() { try { // 最后的兜底方案:使用旧API return wx.getSystemInfoSync(); } catch (error) { console.error('所有获取系统信息的方法都失败了:', error); // 返回默认值 return { windowHeight: 667, windowWidth: 375, statusBarHeight: 44, safeArea: { top: 44, bottom: 667 }, platform: 'unknown', system: 'unknown', model: 'unknown', brand: 'unknown', version: '1.0.0', SDKVersion: '2.0.0', language: 'zh_CN', theme: 'light' }; } } /** * 清除缓存 */ clearCache() { this.cachedInfo = null; this.cacheTime = 0; } /** * 获取菜单按钮信息 */ getMenuButtonBoundingClientRect() { try { return wx.getMenuButtonBoundingClientRect(); } catch (error) { console.warn('获取菜单按钮信息失败:', error); return { width: 87, height: 32, top: 48, right: 365, bottom: 80, left: 278 }; } } /** * 计算导航栏高度 */ getNavBarHeight(systemInfo) { try { const menuButton = this.getMenuButtonBoundingClientRect(); const statusBarHeight = systemInfo.statusBarHeight || 44; // 导航栏高度 = 状态栏高度 + 胶囊按钮高度 + 额外间距 const navBarHeight = statusBarHeight + menuButton.height + (menuButton.top - statusBarHeight) * 2; return navBarHeight; } catch (error) { console.warn('计算导航栏高度失败:', error); return 88; // 默认导航栏高度 } } } // 创建全局实例 const systemInfoHelper = new SystemInfoHelper(); module.exports = { SystemInfoHelper, systemInfoHelper, // 向后兼容的函数 getSystemInfo: () => systemInfoHelper.getSystemInfo(), getSystemInfoSync: () => systemInfoHelper.getSystemInfoSync() };