优先用 uni.getsysteminfosync() 初始化快速读取,但需 try/catch 防 h5 或鸿蒙失败;异步 uni.getsysteminfo() 更稳妥。platform 最稳判平台,osname 辨纯血鸿蒙,uniplatform 是编译目标。

uni.getSystemInfoSync() 和 uni.getSystemInfo() 怎么选
同步接口 uni.getSystemInfoSync() 立即返回结果,适合初始化时快速读取(比如设置状态栏高度、判断平台做条件渲染);异步接口 uni.getSystemInfo() 走回调或 Promise,更稳妥,尤其在小程序环境或某些低端安卓机上,避免因系统信息未就绪导致 undefined 报错。
- 页面
onLoad里想马上用statusBarHeight?用uni.getSystemInfoSync(),但务必加try/catch—— H5 下可能抛错,微信小程序真机有时也慢半拍 - 需要等所有信息加载完再渲染关键 UI?封装成 Promise +
await更可控,Vue 3 的<script setup></script>里直接写const info = await getSystemInfoAsync() - 别在
App.vue的onLaunch里无防护调uni.getSystemInfoSync()—— 某些鸿蒙版本或旧版 HBuilderX 会静默失败,导致后续逻辑崩掉
platform、osName、uniPlatform 这三个字段到底谁靠谱
判断“当前跑在哪”不能只看一个字段:platform 是最常用也最稳定的,返回 "ios"、"android"、"devtools" 或 "web";osName 来自 uni.getDeviceInfoSync().osName,能区分纯血鸿蒙("harmony"),但模拟器/非纯血鸿蒙仍报 "android";uniPlatform 是编译目标平台(如 "mp-weixin"、"h5"),跟运行时设备无关,别拿它当设备类型用。
- 要兼容鸿蒙且需精确识别纯血鸿蒙?必须组合判断:
uni.getDeviceInfoSync()?.osName === 'harmony',但得先uni.canIUse('getDeviceInfoSync')守住底线 - 写条件编译时发现
platform === 'ios'在微信开发者工具里也成立?对,因为工具模拟的是 iOS 环境,此时应结合uni.getSystemInfoSync().hostName(值为"wechat")或uni.getSystemInfoSync().uniPlatform(值为"mp-weixin")进一步确认宿主 - 别信
model字段识别厂商 —— 华为手机返回"HUAWEI ANA-AN00",小米可能是"Xiaomi 2201122C",没统一规则,仅作日志参考
获取 App 版本号为什么 plus.runtime.getProperty 有时不生效
plus.runtime.getProperty 是 5+ SDK 特有 API,只在打包成原生 App(Android/iOS)时可用,H5、小程序里直接报 plus is not defined;而 uni.getSystemInfoSync().appVersion 在所有平台都存在,但注意:H5 下它返回的是 manifest.json 里填的版本,不是浏览器本身版本。
- 跨平台项目想统一取版本?优先用
uni.getSystemInfoSync().appVersion,它在 App、小程序、H5 均有值(H5 值来自配置,App 和小程序来自原生包) - 需要取 Android 的
versionCode或 iOS 的buildNumber?只能走plus.runtime.getProperty,但必须加运行时判断:if (typeof plus !== 'undefined') { ... } - 微信小程序里看到
appVersion是空字符串?检查project.config.json的miniprogramRoot是否正确,以及是否在 app.json 中配置了versionName(部分低版本基础库需手动透出)
安全区(safeArea)和 statusBarHeight 在不同平台表现不一致
statusBarHeight 在 iOS 上是真实状态栏高度(通常 44 或 64),在 Android 上多数为 24–28,但部分全面屏机型(尤其华为、OPPO)可能返回 0;safeArea 对象在 iOS 和微信小程序中完整可用,在 H5 和部分安卓 App 中可能缺失或不准确。
- 做顶部固定导航栏?别只依赖
statusBarHeight,优先用safeAreaInsets?.top,它更语义化,且鸿蒙、iOS、小程序都支持 - H5 下
safeArea为空?可以 fallback 到env = window.navigator.standalone ? 'ios' : 'h5'+ 经验值(如 iOS Safari 为 44,Chrome 安卓为 24) - 在 App.vue 里用
onShow动态监听 safeArea 变化?目前 uni-app 不支持监听,只能首次获取后缓存,或在页面级重新拉取
鸿蒙识别、H5 fallback、plus 兼容性、safeArea 缺失——这些边界情况不会报错,但会让 UI 错位或逻辑跳变,上线前一定得在真机上逐个平台点开调试器看 console 输出的实际字段值。










