247 lines
No EOL
6.2 KiB
JavaScript
247 lines
No EOL
6.2 KiB
JavaScript
/**
|
||
* 系统信息工具类
|
||
* 使用新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()
|
||
};
|