uni.getsysteminfosync() 同步获取系统信息最可靠,windowheight 即可用视口高度无需计算,model 为真实机型,safeareainsets 跨端支持差需平台适配,首次调用后应缓存结果。
直接用 uni.getsysteminfosync() 就够了
绝大多数场景下,不需要异步、不用 promise、不等回调——uni.getsysteminfosync() 同步返回全部字段,且在 app、小程序、h5 三端都稳定可用。它比 uni.getsysteminfo() 更快、更可靠,尤其适合在 onmounted 或页面初始化时直接取值。
常见错误现象:uni.getSystemInfo() 写在 onLoad 里却没等 success 就直接读 res.windowHeight,结果是 undefined;还有人误调 uni.getDeviceInfo(),它只返回 platform 和极简字段,根本拿不到 model 或 windowHeight。
-
model字段才是真实手机型号(如"iPhone15,2"、"HUAWEI ANA-AN00"),不是platform -
brand是厂商名,可用于区分华为/小米/苹果等,但不能代替型号判断 - 模拟器返回的
model常为泛化值(如"iPhone"),真机调试才可信
windowHeight 就是你要的“可视区域高度”
别再手动减状态栏、导航栏、底部安全区——windowHeight 已经帮你处理好了:小程序和 App 端自动扣除状态栏 + 默认导航栏高度;H5 端返回的是 window.innerHeight(不含地址栏)。它就是页面内容能真正渲染的可用高度。
对比几个关键字段:
-
screenHeight:物理屏幕总高度(含状态栏、导航栏、底部指示条) -
statusBarHeight:顶部状态栏/刘海高度(iOS 较稳,Android 厂商差异大) -
windowHeight:直接可用的高度,无需计算,优先使用 - 如果
screenHeight - windowHeight > 60,大概率存在隐藏导航栏或底部安全区(比如微信小程序的胶囊按钮下方留白)
别依赖 safeAreaInsets 做通用适配
safeArea 对象在各端支持差异极大:微信小程序基本可用,App 端部分版本返回空对象,H5 端多数不支持。截至 2026 年 5 月,它仍不是一个可无条件信赖的跨端字段。
如果你确实需要安全区信息(比如全屏视频、底部固定按钮),应做平台判断:
- 小程序端:优先用
systemInfo.safeArea,再 fallback 到systemInfo.screenHeight - systemInfo.windowHeight - App 端:建议用
plus.navigator.getStatusBarHeight()(需plus环境)或监听resize事件动态获取 - H5 端:靠 CSS
env(safe-area-inset-bottom)+padding-bottom更稳妥
硬编码 safeAreaInsets.bottom = 34 这类写法,在 vivo 或 OPPO 新机型上极易失效。
启动时缓存,运行时不重复调用
虽然 uni.getSystemInfoSync() 是同步的,但它在极端低端设备上仍有微小阻塞风险。建议首次调用后缓存结果,后续直接读取:
let cachedSystemInfo = null
function getSystemInfo() {
if (!cachedSystemInfo) {
cachedSystemInfo = uni.getSystemInfoSync()
}
return cachedSystemInfo
}
这个模式避免了 Promise 开销,也绕开了异步时机问题。注意:设备旋转或横竖屏切换时,windowWidth/windowHeight 可能变化,此时需监听 resize 事件并重新获取,但日常竖屏使用无需考虑。
最常被忽略的一点:不要在 data 里给高度写死默认值(比如 viewHeight: 600),应设为 0 或 null,等 onMounted 或 onShow 时再调用 getSystemInfo() 赋值——否则首屏渲染会错位,尤其在 iPhone 拥有动态刘海或安卓全面屏上。











