必须用 uni.getsysteminfosync() 获取完整系统信息,因其同步稳定、返回 model/brand/system 等关键字段;uni.getsysteminfo() 易因异步导致 undefined,uni.getdeviceinfo() 则缺失必要字段。

直接用 uni.getSystemInfoSync(),别绕弯、别等回调、别先调 uni.getDeviceInfo()——它不返回型号和系统版本。
为什么必须用 uni.getSystemInfoSync() 而不是异步版
异步的 uni.getSystemInfo() 容易在 onLoad 或 onLaunch 里误写成“调用后立刻读 res”,结果拿到 undefined;而 uni.getDeviceInfo() 只返回 platform 和空荡荡的字段,压根没有 model、brand、system。同步版一步到位,真机环境下稳定返回完整对象。
常见错误现象:
- 在
data初始化时直接写uni.getSystemInfoSync().model却没做 try/catch —— H5 环境下该 API 可能抛错(虽少见但存在) - 在微信小程序调试基础库低于 2.27.0 的旧版本中,
system字段可能缺失或格式异常
model 和 brand 怎么用才靠谱
model 是唯一能反映硬件身份的字段,但各平台填充逻辑完全不同,不能字符串全等匹配:
- iOS 返回代号(如
"iPhone15,2")或用户可见名(如"iPhone 15 Pro"),取决于系统版本和 SDK - 安卓多数返回 OEM 硬件代号(如华为
"ELE-AL00"、小米"2201122C"),不是“Mate 60”或“K50”这种营销名 - H5 下
model恒为"browser",不可用于机型识别 -
brand在部分安卓定制 ROM 中可能为空或"unknown",不能单独依赖
实操建议:
- 做白名单模糊匹配:比如用
res.model.includes('iPhone')或正则/iPhone\d+,\d+/ - 安卓端优先结合
res.brand缩小范围,再查代号映射表(需自行维护) - 真机调试前务必清缓存——旧 SDK 可能缓存了错误的
model值
system 字段提取版本号必须用正则,别直接比字符串
system 格式极不统一:"iOS 17.5"、"Android 14"、甚至小写 "ios 16.4" 都可能出现。直接 res.system > "iOS 15" 会因字符串比较规则出错("iOS 9" > "iOS 15" 为 true)。
正确做法是先判断平台,再提取数字:
const sys = uni.getSystemInfoSync();
if (sys.platform === 'ios') {
const match = sys.system.match(/iOS\s+(\d+)/i);
const version = match ? parseInt(match[1], 10) : 0;
if (version
<p>关键点:</p>
- 正则加
i标志防大小写异常 - 务必先用
sys.platform === 'ios'做平台隔离——安卓端system也可能含数字,不隔离会误判 - 别依赖
platform判断系统类型——微信内嵌 WebView 中它常误报为"devtools"
需要精确识别芯片或原始硬件代号?uni.getSystemInfoSync() 不够用
当项目要求区分 A17 芯片、M 系列 Mac、或读取原始 Build.MODEL(如 "SM-S918B" vs "SM-S918U")时,model 字段已被 uni-app 规范化,无法满足。
此时必须进 UTS 层写原生调用:
- Android:导入
android.os.Build,读Build.MODEL或Build.DEVICE - iOS:用
UTSiOS.UIDevice.currentDevice.model得到"iPhone"/"iPad",再结合NSProcessInfo.processInfo.environment["SIMULATOR_DEVICE_NAME"]辅助判断模拟器 - 注意:UTS 代码无法在 H5 平台运行,必须加平台判断或 fallback
真正容易被忽略的是:H5 环境下所有这些字段都不可信,model === "browser" 是常态,不是 bug;而微信内嵌 WebView 的 platform 和 system 行为比真机更混乱,别拿它当测试依据。











