findme-miniprogram-frontend/utils/system-info-modern.js

242 lines
6.4 KiB
JavaScript
Raw Normal View History

2025-12-27 17:16:03 +08:00
/**
* 现代化系统信息工具类
* 使用新的API替代已弃用的wx.getSystemInfoSync
*/
class ModernSystemInfo {
constructor() {
this.systemInfo = null;
this.isInitialized = false;
}
/**
* 获取完整的系统信息推荐使用
*/
getSystemInfo() {
try {
// 使用新的API获取系统信息
const windowInfo = wx.getWindowInfo();
const deviceInfo = wx.getDeviceInfo();
const appBaseInfo = wx.getAppBaseInfo();
// 合并所有信息
const systemInfo = {
...windowInfo,
...deviceInfo,
...appBaseInfo,
// 添加一些常用的计算属性
isIOS: deviceInfo.platform === 'ios',
isAndroid: deviceInfo.platform === 'android',
isDevtools: deviceInfo.platform === 'devtools'
};
this.systemInfo = systemInfo;
this.isInitialized = true;
return systemInfo;
} catch (error) {
console.error('获取系统信息失败,使用兜底方案:', error);
return this.getFallbackSystemInfo();
}
}
/**
* 兜底方案使用旧API
*/
getFallbackSystemInfo() {
try {
const systemInfo = wx.getSystemInfoSync();
this.systemInfo = {
...systemInfo,
isIOS: systemInfo.platform === 'ios',
isAndroid: systemInfo.platform === 'android',
isDevtools: systemInfo.platform === 'devtools'
};
this.isInitialized = true;
return this.systemInfo;
} catch (error) {
console.error('兜底方案也失败了:', error);
// 返回默认值
return {
statusBarHeight: 44,
windowHeight: 667,
windowWidth: 375,
screenHeight: 667,
screenWidth: 375,
platform: 'unknown',
system: 'unknown',
version: 'unknown',
isIOS: false,
isAndroid: false,
isDevtools: false
};
}
}
/**
* 获取导航栏相关信息
*/
getNavigationInfo() {
try {
const systemInfo = this.systemInfo || this.getSystemInfo();
const menuButtonInfo = wx.getMenuButtonBoundingClientRect();
const statusBarHeight = systemInfo.statusBarHeight;
const menuButtonHeight = menuButtonInfo.height;
const menuButtonTop = menuButtonInfo.top;
const menuButtonBottom = menuButtonInfo.bottom;
// 导航栏高度计算
const navBarHeight = menuButtonBottom + menuButtonTop - statusBarHeight;
return {
statusBarHeight,
menuButtonHeight,
menuButtonTop,
menuButtonBottom,
navBarHeight,
menuButtonInfo
};
} catch (error) {
console.error('获取导航栏信息失败:', error);
return {
statusBarHeight: 44,
menuButtonHeight: 32,
menuButtonTop: 6,
menuButtonBottom: 38,
navBarHeight: 88,
menuButtonInfo: {}
};
}
}
/**
* 获取安全区域信息
*/
getSafeAreaInfo() {
try {
const systemInfo = this.systemInfo || this.getSystemInfo();
const safeArea = systemInfo.safeArea || {};
return {
safeAreaTop: safeArea.top || 0,
safeAreaBottom: systemInfo.screenHeight ? systemInfo.screenHeight - safeArea.bottom : 0,
safeAreaLeft: safeArea.left || 0,
safeAreaRight: systemInfo.screenWidth ? systemInfo.screenWidth - safeArea.right : 0,
safeArea: safeArea
};
} catch (error) {
console.error('获取安全区域信息失败:', error);
return {
safeAreaTop: 0,
safeAreaBottom: 0,
safeAreaLeft: 0,
safeAreaRight: 0,
safeArea: {}
};
}
}
/**
* 一次性获取页面所需的所有系统信息
*/
getPageSystemInfo() {
const systemInfo = this.getSystemInfo();
const navigationInfo = this.getNavigationInfo();
const safeAreaInfo = this.getSafeAreaInfo();
return {
...systemInfo,
...navigationInfo,
...safeAreaInfo
};
}
}
// 创建单例实例
const modernSystemInfo = new ModernSystemInfo();
/**
* 简化的页面系统信息初始化函数
* 用于快速替换页面中的 wx.getSystemInfoSync() 调用
*/
function initPageSystemInfo() {
try {
const windowInfo = wx.getWindowInfo();
const deviceInfo = wx.getDeviceInfo();
const appBaseInfo = wx.getAppBaseInfo();
const menuButtonInfo = wx.getMenuButtonBoundingClientRect();
// 合并系统信息
const systemInfo = {
...windowInfo,
...deviceInfo,
...appBaseInfo
};
// 计算导航栏相关信息
const statusBarHeight = windowInfo.statusBarHeight;
const menuButtonHeight = menuButtonInfo.height;
const menuButtonTop = menuButtonInfo.top;
const menuButtonBottom = menuButtonInfo.bottom;
const navBarHeight = menuButtonBottom + menuButtonTop - statusBarHeight;
const windowHeight = windowInfo.windowHeight;
const safeAreaBottom = windowInfo.safeArea ? windowInfo.screenHeight - windowInfo.safeArea.bottom : 0;
return {
systemInfo,
statusBarHeight,
menuButtonHeight,
menuButtonTop,
navBarHeight,
windowHeight,
safeAreaBottom,
menuButtonInfo
};
} catch (error) {
console.error('现代API获取系统信息失败使用兜底方案:', error);
// 兜底方案
try {
const systemInfo = wx.getSystemInfoSync();
const menuButtonInfo = wx.getMenuButtonBoundingClientRect();
const statusBarHeight = systemInfo.statusBarHeight;
const menuButtonHeight = menuButtonInfo.height;
const menuButtonTop = menuButtonInfo.top;
const menuButtonBottom = menuButtonInfo.bottom;
const navBarHeight = menuButtonBottom + menuButtonTop - statusBarHeight;
const windowHeight = systemInfo.windowHeight;
const safeAreaBottom = systemInfo.safeArea ? systemInfo.screenHeight - systemInfo.safeArea.bottom : 0;
return {
systemInfo,
statusBarHeight,
menuButtonHeight,
menuButtonTop,
navBarHeight,
windowHeight,
safeAreaBottom,
menuButtonInfo
};
} catch (fallbackError) {
console.error('兜底方案也失败了:', fallbackError);
return {
systemInfo: {},
statusBarHeight: 44,
menuButtonHeight: 32,
menuButtonTop: 6,
navBarHeight: 88,
windowHeight: 667,
safeAreaBottom: 0,
menuButtonInfo: {}
};
}
}
}
module.exports = {
modernSystemInfo,
initPageSystemInfo
};