uni.getSystemInfoSync()无法获取IMEI/OAID,因其仅返回系统级只读信息,而IMEI受Android 10+和iOS严格限制,OAID需厂商SDK集成、用户授权且非系统原生支持。

uni-app 无法直接获取 IMEI,Android 10+ 和 iOS 全系都禁止了;OAID 仅限 Android 且需厂商支持、用户授权、额外 SDK 集成——原生 API 或 uni.getSystemInfoSync() 根本不提供这些字段。
为什么 uni.getSystemInfoSync() 拿不到 IMEI/OAID
这个 API 只返回系统级只读信息(如 model、platform、uniPlatform),不涉及设备标识符权限。IMEI 属于敏感硬件信息,Android 从 6.0 开始要求 READ_PHONE_STATE 权限,10+ 直接对非系统应用屏蔽;iOS 自 7 起就彻底移除了公开 API 访问 IMEI 的能力。
- 调用后在
res里找imei、oaid字段?不存在,字段不会出现 - 试图用
plus.device.getInfo()(5+ SDK)?Android 10+ 返回空字符串或占位符,iOS 恒为 undefined - 误以为打包时勾选“读取电话状态”权限就能拿到?权限只是前提,不是充分条件
Android 上想拿 OAID:必须走厂商联盟 SDK
OAID 是中国移动安全联盟(MSA)推的替代方案,但不是系统原生能力——得集成对应厂商的 SDK(如华为 HMS、小米 MiSDK、OPPO OPPO SDK),再调用其封装方法,且用户必须开启“广告 ID”开关(设置 → 隐私 → 广告服务)。
- uni-app 项目需通过
nativePlugins引入对应厂商 SDK,不能只靠 JS 层调用 - 不同厂商 API 不统一:华为走
hms:ads:4.0.40.301+HmsInstanceId.getInstance().getAdvertisingIdInfo(),小米要MiAdIdManager.getAdvertisingId() - 即使集成成功,首次调用可能返回
isLimitAdTrackingEnabled: true(用户关闭了广告追踪),此时 OAID 无效 - 不要尝试用 WebView 注入 JS 拦截 OAID——App Store 审核会拒,国内各大应用市场也会扫出违规 SDK
替代方案怎么选:看你要做什么
硬要设备唯一 ID,99% 的场景其实不需要 IMEI/OAID;滥用反而触发审核拒绝或用户卸载。
- 做登录态/账号绑定?用服务端生成的
userId+token,前端存uni.setStorageSync('uid', ...) - 做反作弊或设备风控?优先用
uni.getProvider({service: 'ad'})拿到的adid(广告 ID 封装层,部分平台自动 fallback 到 OAID),或自研指纹(getSystemInfo+getNetworkType+ 屏幕宽高 + UA 片段拼接,稳定性约 85%) - 真要上报给第三方 SDK(如友盟、GrowingIO)?它们内部已处理兼容逻辑,你只需传配置项
needOaid: true,别自己重复捞 - 测试阶段想 mock 数据?在
manifest.json → android → permissions加"android.permission.READ_PHONE_STATE"仅对 Android 9 及以下模拟器有效,别当真
最常被忽略的一点:很多开发者卡在“为什么真机调试看不到 OAID”,其实是因为没在手机系统设置里手动打开广告追踪权限——这个开关默认关闭,且不在 App 权限弹窗里,得引导用户去系统设置翻三页才能找到。










