findme-miniprogram-frontend/utils/system-info-helper.js
2025-12-27 17:16:03 +08:00

247 lines
6.2 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 系统信息工具类
* 使用新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()
};