写点什么

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

  • 2023-04-24
    上海
  • 本文字数:2669 字

    阅读完需:约 9 分钟

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

一、前言

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


SystemInfo 里的 deviceIdplus.device 并非同一个值。


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


二、系统标识获取方法

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


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


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


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


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


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


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


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


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


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


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

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


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

三、无权限问题解决

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


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



总结:


  • 查看版本更新记录还是很有必要的。

  • 升级有风险,降级需谨慎!

四、拓展阅读

  • H5+ API

  • uni-app getsysteminfosync

  • 获取设备信息(imei、imsi、uuid)的调整使用plus.device.getInfo方法的说明

  • 应用模块配置

  • 5+App模块配置错误处理@[TOC]

    ## 一、前言

    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` 需要的信息,导致授权后没有重新走逻辑,故没有弹出权限请求弹窗。

    ![在这里插入图片描述](https://img-blog.csdnimg.cn/e0aa66fc3a164aa39e33fe65e59e3321.png)

    ## 二、系统标识获取方法

    `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 就已经进行了上述配置改造。

    ![在这里插入图片描述](https://img-blog.csdnimg.cn/d90c828c9a6a475595128d7efdefd790.png)

    总结:

    - 查看版本更新记录还是很有必要的。

    - 升级有风险,降级需谨慎!

    ## 四、拓展阅读

    - [H5+ API](https://www.html5plus.org/doc/zh_cn/device.html)

    - [uni-app getsysteminfosync](https://uniapp.dcloud.net.cn/api/system/info.html#getsysteminfosync)

    - [获取设备信息(imei、imsi、uuid)的调整使用 plus.device.getInfo 方法的说明](https://ask.dcloud.net.cn/article/36075)

    - [应用模块配置](https://uniapp.dcloud.net.cn/tutorial/app-modules.html#bcor)

    - [5+App 模块配置错误处理](https://ask.dcloud.net.cn/article/283)

发布于: 刚刚阅读数: 4
用户头像

No Silver Bullet 2021-07-09 加入

岂曰无衣 与子同袍

评论

发布
暂无评论
跨平台应用开发进阶(五十五):uni-app 获取设备信息及 APP 报无相应权限问题分析及解决_uni-app_No Silver Bullet_InfoQ写作社区