井
  • 发布:2023-07-17 22:43
  • 更新:2023-07-18 22:50
  • 阅读:431

【报Bug】barcode 组件在 ios 平台上的摄像头权限问题,以及初始化失败的 error 事件没有触发

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Mac

PC开发环境操作系统版本号: macOS 12.6.7

HBuilderX类型: 正式

HBuilderX版本号: 3.8.7

手机系统: iOS

手机系统版本号: iOS 16

手机厂商: 苹果

手机机型: iPhone11

页面类型: nvue

vue版本: vue3

打包方式: 云端

项目创建方式: HBuilderX

操作步骤:

ios,barcode 组件初始化的权限问题,或者初始化失败的 error 事件回调问题

预期结果:

ios barcode 组件初始化失败,触发 error 事件

实际结果:

ios barcode 组件初始化失败,不会触发 error 事件

bug描述:

<barcode/>组件初始化失败,没有回调到error事件。

背景

ios上只有使用了权限,才会弹出授权询问弹窗,只有弹出了授权弹窗,设置中才会有该权限的设置选项。安卓可以提前判断权限,没什么问题。

问题

  • barcode 组件初始化前判断权限。第一次必返回-1(无权限),而且不会弹出授权弹窗。所以此种操作,假如用户同意了权限,依然返回无权限,我也不知道要不要初始化组件 。假如用户拒绝了权限,提示前往设置打开权限也没用,设置中还未有该权限。
  • barcode 直接初始化,不提前判断权限。这样会弹出授权提示,假如用户同意授权,没什么问题,正常逻辑。假如用户拒绝了权限,barcode 会初始化失败,但是我不知道用户拒绝了呀,barcode组件的初始化失败,我也不知道。error 事件并没有触发。然后 barcode 白屏,js 还啥都不知道。

这流程就不能完整的跑通啊。

2023-07-17 22:43 负责人:DCloud_iOS_WZT 分享
已邀请:
DCloud_iOS_WZT

DCloud_iOS_WZT

先通过api检测权限 如果是not determined 去调用barcode 弹系统授权

  • (作者)

    调用barcode弹系统授权,用户拒绝了,js不知道,界面出不来,JS也不知道用户是拒绝还是同意

    2023-07-18 13:20

  • DCloud_iOS_WZT

    回复 : 你在失败里再查一次权限

    2023-07-18 13:50

  • DCloud_iOS_WZT

    回复 : 你发一下示例工程,看下怎么写的

    2023-07-18 13:54

  • (作者)

    回复 DCloud_iOS_WZT: 问题中上传附件了,麻烦看一下

    2023-07-18 14:56

  • (作者)

    回复 DCloud_iOS_WZT: 用户拒绝授权,初始化失败,没有触发失败事件

    2023-07-18 15:12

井

(作者)

barcode-example

  • DCloud_iOS_WZT

    https://uniapp.dcloud.net.cn/api/system/getappauthorizesetting.html#getappauthorizesetting 你看下这个设置权限,如果拒绝再弹你自己的提示框 另外如果未授权的情况下调用了barcode 拒绝是会返回错误的

    2023-07-18 15:12

  • (作者)

    回复 DCloud_iOS_WZT: 我试试,稍等

    2023-07-18 15:14

  • DCloud_iOS_WZT

    回复 : 另外看下是不是没勾选camera模块

    2023-07-18 15:15

  • (作者)

    回复 DCloud_iOS_WZT: 不行啊,首先调用uni.getAppAuthorizeSetting(),返回"cameraAuthorized": "not determined"。然后我要初始化<barcode/>组件,然后才弹出授权弹窗,用户点击拒绝,然后就没然后了。没有触发任何事件,也没有任何回调。不是调用plus.barcode.create,而是初始化<barcode/>组件,你下载下来我上传的示例工程,卸载后,重新安装看一下效果

    2023-07-18 15:19

  • (作者)

    回复 DCloud_iOS_WZT: 用户点击同意授权,流程是完全正常的,可以初始化成功,所以不可能是没勾选camera模块

    2023-07-18 15:20

  • DCloud_iOS_WZT

    回复 : https://uniapp.dcloud.net.cn/component/barcode.html# 按文档写 方法写到method里面

    2023-07-18 15:34

  • (作者)

    回复 DCloud_iOS_WZT: 那我再试试vue3 的 options api

    2023-07-18 15:46

  • (作者)

    回复 DCloud_iOS_WZT: https://uniapp.dcloud.net.cn/component/barcode.html# 完全按照文档中的代码示例,全部 copy,弹出授权提示的时候,用户选择拒绝,同样没有任何事件触发

    2023-07-18 15:53

  • DCloud_iOS_WZT

    回复 : 进入barcode模块前去检测权限,如果未授权手动触发授权,网上有很多权限检测的插件可以看一下

    2023-07-18 19:57

  • (作者)

    回复 DCloud_iOS_WZT: 这个一开始就说过了呀。。。进入barcode模块前去检测权限,如果未授权手动触发授权。关键是怎么手动触发授权。安卓不用说,iOS 只有调用了权限,才会弹出授权弹窗。网上很多权限检测的插件,但是没有iOS 手动触发权限的,这是 iOS 系统的逻辑,和插件没什么关系吧。现在的问题是,没有权限<barcode>组件初始化失败,没有触发<barcode>组件的 error 事件。所以开发者不知道是否初始化失败。原生组件<barcode>初始化失败,正确触发 error 事件就完事了。例子也有了,只要你运行一下就能复现。或者你们给一个 vue3 能正确运行的例子。。。

    2023-07-18 20:29

  • DCloud_iOS_WZT

    回复 : https://ext.dcloud.net.cn/plugin?id=8674 可以使用这种原生插件 或者https://www.html5plus.org/doc/zh_cn/ios.html 自己写njs直接申请原生的相机权限

    2023-07-18 20:58

井

(作者)

@DCloud_iOS_WZT 有确认 bug 吗?需要录像演示吗?

井

(作者)

复现流程:

  1. HBuilderX 新建一个 vue3 的uniapp默认模板项目
  2. 重命名 /pages/index/index.vue为 index.nvue
  3. manifest.json文件APP 模块配置 勾选Barcode(扫码)
  4. https://uniapp.dcloud.net.cn/component/barcode.html# 到官方文档页面 copy 全部代码,粘贴覆盖到/pages/index/index. nvue中
  5. 点击启动运行到iOS App 基座。不要运行到模拟器,因为不能触发摄像头
  6. 填写证书相关字段
  7. 运行成功,打开 APP,申请权限时点击拒绝摄像头权限点击拒绝摄像头权限点击拒绝摄像头权限。然后<barcode>组件初始化失败,但是没有任何错误信息发生,开发者是不知道用户点击的是同意还是拒绝的。

可以初始化前判断权限,网上有很多 iOS 判断权限的示例,或者官方也有提供https://uniapp.dcloud.net.cn/api/system/getappauthorizesetting.html#getappauthorizesetting。

但是但是但是,iOS APP 第一次打开的时候,还未初始化 barcode 组件,是不会调起摄像头授权提示的,那么判断权限的结果必定返回“not determined”(未定义),而且不会弹起授权提示。

这个时候你判断权限通过,开始初始化<barcode>组件,才会弹起授权提示,用户拒绝,就完了。你根本不知道用户拒绝了。
假如你判断权限未通过,前往设置打开此权限,可是设置里根本没有这个权限。iOS 只有询问过用户的权限,才会在设置中显示。

井

(作者)

要写 native 的代码了,,,好一通搜索,终于磕磕绊绊的达到了目的

const AVCaptureDevice = plus.ios.import('AVCaptureDevice')  
// 拉起授权弹窗  
AVCaptureDevice.requestAccessForMediaTypecompletionHandler('vide', function(){  
  // 这里的回调,用户已点击同意或者拒绝  
  // 这里再判断权限  
  const authStatus = AVCaptureDevice.authorizationStatusForMediaType('vide')  
  // 0-还没决定 1-受限制 2-拒绝 3-已授权  
  // 最后删除引入的对象  
  plus.ios.deleteObject(AVCaptureDevice)  
  // TODO: 这里根据权限状态authStatus来做处理。用户拒绝的话可以跳到设置页打开权限  
})

上面代码拉起的授权弹窗,我发现授权提示文本,没有显示manifest.json中配置的NSCameraUsageDescription描述文本。不知道是自定义基座的问题,还是写法有问题。

以上代码仅做参考,希望能帮到其他遇到该问题的同学。我遇到这问题的时候,真的各种上天无路,入地无门,很绝望的感觉。


顺便说一下,<barcode>组件初始化失败,为什么没有回调到 error 事件,就很奇怪。小程序的<camera>组件就会触发 error 事件。
再顺便说一下,<barcode>组件中间的扫描框为啥去不掉,即使号称自定义扫码组件,这个框,开发者完全可以自己写,扫描的线条动画,也完全可以自己写。覆盖上去就完事了。这样去不掉的框,不能改样式的线条动画,实在称不上自定义扫码组件。小程序的<camera>组件,就没有这些,开发者完全可以自定义任何设计师画的样式。

  • DCloud_iOS_WZT

    有定制需求 建议自己写原生插件

    2023-07-19 10:59

  • 5***@qq.com

    请问这个是拉起摄像头授权页面的很好;其他关于相册的、音频的?请问楼主是哪个关键字??

    2024-01-27 11:42

要回复问题请先登录注册