uni-app live-pusher在ios中无法触发statechange netstatus error事件,安卓正常
uni-app live-pusher在ios中无法触发statechange netstatus error事件,安卓正常
| 开发环境 | 版本号 | 项目创建方式 |
|---|---|---|
| Windows | Windows7旗舰版 | HBuilderX |
产品分类:uniapp/App
PC开发环境操作系统:Windows
HBuilderX类型:正式
HBuilderX版本号:3.2.3
手机系统:iOS
手机系统版本号:iOS 13.4
手机厂商:苹果
手机机型:IPhoneX
页面类型:nvue
打包方式:云端
示例代码:
```html
<live-pusher
device-position="back"
id='livePusher'
ref="livePusher"
class="livePusher"
url=""
mode="SD"
muted="true"
enable-camera="true"
auto-focus="true"
beauty="1"
whiteness="2"
aspect="1:1"
local-mirror=""
[@statechange](/user/statechange)="statechange"
[@netstatus](/user/netstatus)="netstatus"
[@error](/user/error)="error"
/>
onReady() {
this.context = uni.createLivePusherContext("livePusher", this)
},
onShow() {
this.$nextTick(() => {
setTimeout(() => {
this.startPreview()
}, 10)
}),
this.context.startPreview({
success: (a) => {
// 用户拒绝和允许都会走success,打印结果为{"errMsg":"startPreview:ok"}
console.log("livePusher.switchCamera:" + JSON.stringify(a));
this.checkOpenPermission()
},
fail: (e) => {
console.log(e)
}
});
}
操作步骤: 一进入页面开始开启摄像头,手机会自动提示用户允许活拒绝,用户拒绝后,不触发statechange,error事件,并且正常走success里面。
预期结果: 期望可以判断用户是否允许开启了摄像头,如未开启,弹框提示用户去开启
实际结果: 现在没有方式去判断,permission.js不知道放在什么时候去判断,放在startPreview用户还未点击拒绝,permission判断就走完了。 其他人也提过类似的问题,如下图
bug描述: 使用live-pusher自定义摄像头拍照,已经在manifest.json里勾选了直播流。现在的情况是进入当前页面需要开启直播流,手机会提示用户拒绝或允许开启权限,用户拒绝开启摄像头后,ios不会触发statechange和error事件,安卓是正常的。并且this.context.startPreview开启摄像头的时候,用户没有开启权限,也会走success里面。怎么样才能判断用户是否开启了权限呢?使用permission.js判断放在什么时候判断合适呢?
更多关于uni-app live-pusher在ios中无法触发statechange netstatus error事件,安卓正常的实战教程也可以访问 https://www.itying.com/category-93-b0.html
相机权限的话 可以通过 Native.js 去判断
你看下这篇文章是不是你想要的 https://ask.dcloud.net.cn/article/35915
更多关于uni-app live-pusher在ios中无法触发statechange netstatus error事件,安卓正常的实战教程也可以访问 https://www.itying.com/category-93-b0.html
针对iOS中live-pusher在用户拒绝摄像头权限后不触发statechange、netstatus、error事件的问题,这是iOS平台的一个已知限制。由于iOS系统的权限管理机制,在用户拒绝权限时,live-pusher组件不会像Android那样触发相关事件回调。
解决方案:
-
权限检查时机调整
将permission.js的权限检查放在startPreview的success回调中执行。虽然用户拒绝权限后仍会进入success回调,但此时可以立即进行权限状态验证:this.context.startPreview({ success: (res) => { // 立即检查摄像头权限状态 uni.getSetting({ success: (settingRes) => { const authStatus = settingRes.authSetting['scope.camera'] if (authStatus === false) { // 用户已拒绝权限,显示引导开启提示 this.showPermissionGuide() } else if (authStatus === true) { // 权限已开启,继续正常流程 this.checkOpenPermission() } } }) }, fail: (e) => { console.log('startPreview失败:', e) } }) -
使用uni.getSetting进行权限状态判断
通过uni.getSetting可以准确获取摄像头权限的当前状态(true/false/undefined),这是判断用户是否授权的最可靠方式。 -
添加超时检测机制
在startPreview后设置一个超时检测,如果一段时间内没有收到正常的推流状态变化,可以结合权限状态进行判断:let permissionTimeout = setTimeout(() => { uni.getSetting({ success: (res) => { if (res.authSetting['scope.camera'] === false) { this.showPermissionGuide() } } }) }, 2000) // 在statechange正常触发时清除定时器 statechange(e) { clearTimeout(permissionTimeout) // 正常处理状态变化 }

