248 lines
6.2 KiB
JavaScript
248 lines
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()
|
|||
|
|
};
|