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

241 lines
6.4 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 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
};