跨平台应用开发进阶(五十五):uni-app 获取设备信息及 APP 报无相应权限问题分析及解决

一、前言

APP开发过程中,需要获取设备ID信息。在实践过程中,发现不同版本的HBuilderX,在调用uni.getSystemInfoSync()接口后,获取到的结果不一致,导致业务逻辑出现问题。例如:使用3.2.15之前的版本调用uni.getSystemInfo接口获取deviceId,安卓设备获取到的为32位数的字符串,包含数字和英文大写字母,例如20FEE6B89972BF2C5D0C9A03B725818A,更新至3.2.15版本相同的代码获取到的deviceId为16位字符串,数字和小写字母组合,如5d09ed0224ad7e2d。

SystemInfo 里的 deviceId 和 plus.device 并非同一个值。

另外,uniapp初始化时就生成好了 getSystemInfoSync 需要的信息,导致授权后没有重新走逻辑,故没有弹出权限请求弹窗。

二、系统标识获取方法

Android 平台各大应用商店已经要求 API 等级(targetSdkVersion)为26或以上。高版本Android系统完善了授权系统,获取设备信息(如imei)需要经过用户授权确认,弹出获取设备信息的授权提示框。

如果不在manifest里指定,HBuilder的打包默认targetSdkVersion是21,而HBuilderX已经是26了。targetSdkVersion变高就会引发动态权限问题。

目前5+ API获取设备信息是通过以下属性方式读取。

为了保证以上属性可用,应用需在启动时进行初始化赋值 ,原生层这时候就需要申请获取设备信息权限读取imei、imsi等信息。

即使应用没有调用以上API,应用启动时仍然执行此初始化赋值逻辑,导致应用启动时弹出设备信息授权提示框。

注意⚠️:为了避免应用启动时弹出设备信息授权提示框,建议使用5+ API的属性方式获取imei、imsi、uuid信息的代码调整使用plus.device.getInfo方法。

至于属性和方法的区别,可能普通程序员看不懂,但做底层的会知道,属性就是启动时就必须初始化的。

原来的plus.device.imei、plus.device.imsi、plus.device.uuid等属性方式的API不推荐使用,后续会逐步废弃。

为了保证向下兼容,目前还可以使用,但不一定可以获取到正确的值。

取决于应用启动前是否已经获取设备信息权限:

  • 如果应用启动前没有获取设备信息授权(询问或拒绝状态),则无法获取设备信息,按权限被拒绝的逻辑处理。

  • 如果应用获取设备信息授权,则可以获取设备信息。

注意⚠️:调用plus.device.imei、plus.device.imsi、plus.device.uuid不会触发授权提示框。

三、无权限问题解决

查看Hbuilderx更新3.6.13的版本记录有:调整 Camera&Gallery、Barcode、Orientation、Record等模块从引擎内置调整为独立模块,解决iOS平台隐私合规检测可能报包含麦克风、相机/相册、运动等权限的问题。云端打包默认不再包含以上模块,如需要请手动在 manifest.json -> 模块配置中勾选相应模块。

从官方文档可知,其实从3.6.11就已经进行了上述配置改造。 总结:

  • 查看版本更新记录还是很有必要的。
  • 升级有风险,降级需谨慎!

四、拓展阅读

相关推荐
ZoeLandia10 分钟前
TypeScript 04:类型断言与类型守卫
开发语言·前端·typescript
guzicheng199013 分钟前
webpack 安装笔记:全局 vs 本地,以及一个 PATH 环境变量的坑
前端·webpack
西索斯coding19 分钟前
Claude Code 工具调用返回空怎么办?claude-opus-5.5 的 input_schema 校验踩坑记录与修复方案
服务器·前端·javascript·ai
疯狂敲代码的老刘20 分钟前
MarvellousSuspender浏览器扩展:1.4K星开源标签页冻结神器,Chrome吃内存终结者的干净复活版
前端·chrome
码上上班21 分钟前
shell 脚本知识点总结
前端·chrome
程序员Sunday23 分钟前
Flex 和 Grid 有什么区别?一维布局、二维布局怎么选?
前端·css·面试
Jlzn888825 分钟前
华南PACK线自动化率怎么统计才靠谱
前端·javascript·自动化
拖孩1 小时前
AI 时代,个人开发者到底能不能靠一个小程序赚到钱
前端·后端·微信小程序
Hilaku1 小时前
ERP选型时不问MCP,等于默认三年后再付一次集成费!
前端·javascript·程序员
程序人生8881 小时前
几百张固定位置扫描件如何离线批量清?DocConverter Web 批量去水印链路
前端