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

2 回复

相机权限的话 可以通过 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那样触发相关事件回调。

解决方案:

  1. 权限检查时机调整
    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)
      }
    })
    
  2. 使用uni.getSetting进行权限状态判断
    通过uni.getSetting可以准确获取摄像头权限的当前状态(true/false/undefined),这是判断用户是否授权的最可靠方式。

  3. 添加超时检测机制
    在startPreview后设置一个超时检测,如果一段时间内没有收到正常的推流状态变化,可以结合权限状态进行判断:

    let permissionTimeout = setTimeout(() => {
      uni.getSetting({
        success: (res) => {
          if (res.authSetting['scope.camera'] === false) {
            this.showPermissionGuide()
          }
        }
      })
    }, 2000)
    
    // 在statechange正常触发时清除定时器
    statechange(e) {
      clearTimeout(permissionTimeout)
      // 正常处理状态变化
    }
回到顶部