ios,barcode 组件初始化的权限问题,或者初始化失败的 error 事件回调问题
- 发布:2023-07-17 22:43
- 更新:2023-07-18 22:50
- 阅读:431
产品分类: 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 事件
ios barcode 组件初始化失败,不会触发 error 事件
bug描述:
<barcode/>组件初始化失败,没有回调到error事件。
背景
ios上只有使用了权限,才会弹出授权询问弹窗,只有弹出了授权弹窗,设置中才会有该权限的设置选项。安卓可以提前判断权限,没什么问题。
问题
- barcode 组件初始化前判断权限。第一次必返回-1(无权限),而且不会弹出授权弹窗。所以此种操作,假如用户同意了权限,依然返回无权限,我也不知道要不要初始化组件 。假如用户拒绝了权限,提示前往设置打开权限也没用,设置中还未有该权限。
- barcode 直接初始化,不提前判断权限。这样会弹出授权提示,假如用户同意授权,没什么问题,正常逻辑。假如用户拒绝了权限,barcode 会初始化失败,但是我不知道用户拒绝了呀,barcode组件的初始化失败,我也不知道。error 事件并没有触发。然后 barcode 白屏,js 还啥都不知道。
这流程就不能完整的跑通啊。
井 (作者)
barcode-example
-
https://uniapp.dcloud.net.cn/api/system/getappauthorizesetting.html#getappauthorizesetting 你看下这个设置权限,如果拒绝再弹你自己的提示框 另外如果未授权的情况下调用了barcode 拒绝是会返回错误的
2023-07-18 15:12
-
井 (作者)
回复 DCloud_iOS_WZT: 不行啊,首先调用uni.getAppAuthorizeSetting(),返回"cameraAuthorized": "not determined"。然后我要初始化<barcode/>组件,然后才弹出授权弹窗,用户点击拒绝,然后就没然后了。没有触发任何事件,也没有任何回调。不是调用plus.barcode.create,而是初始化<barcode/>组件,你下载下来我上传的示例工程,卸载后,重新安装看一下效果
2023-07-18 15:19
-
回复 井: https://uniapp.dcloud.net.cn/component/barcode.html# 按文档写 方法写到method里面
2023-07-18 15:34
-
井 (作者)
回复 DCloud_iOS_WZT: https://uniapp.dcloud.net.cn/component/barcode.html# 完全按照文档中的代码示例,全部 copy,弹出授权提示的时候,用户选择拒绝,同样没有任何事件触发
2023-07-18 15:53
-
井 (作者)
回复 DCloud_iOS_WZT: 这个一开始就说过了呀。。。进入barcode模块前去检测权限,如果未授权手动触发授权。关键是怎么手动触发授权。安卓不用说,iOS 只有调用了权限,才会弹出授权弹窗。网上很多权限检测的插件,但是没有iOS 手动触发权限的,这是 iOS 系统的逻辑,和插件没什么关系吧。现在的问题是,没有权限<barcode>组件初始化失败,没有触发<barcode>组件的 error 事件。所以开发者不知道是否初始化失败。原生组件<barcode>初始化失败,正确触发 error 事件就完事了。例子也有了,只要你运行一下就能复现。或者你们给一个 vue3 能正确运行的例子。。。
2023-07-18 20:29
-
回复 井: https://ext.dcloud.net.cn/plugin?id=8674 可以使用这种原生插件 或者https://www.html5plus.org/doc/zh_cn/ios.html 自己写njs直接申请原生的相机权限
2023-07-18 20:58
井 (作者)
复现流程:
- HBuilderX 新建一个 vue3 的uniapp默认模板项目
- 重命名 /pages/index/index.vue为 index.nvue
- manifest.json文件APP 模块配置 勾选Barcode(扫码)
- https://uniapp.dcloud.net.cn/component/barcode.html# 到官方文档页面 copy 全部代码,粘贴覆盖到/pages/index/index. nvue中
- 点击启动运行到iOS App 基座。不要运行到模拟器,因为不能触发摄像头
- 填写证书相关字段
- 运行成功,打开 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>组件,就没有这些,开发者完全可以自定义任何设计师画的样式。
井 (作者)
调用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