uni-app 申请某个权限并拒绝后 查询该权限无授权弹窗但会立即触发uni.createRequestPermissionListener的onConfirm、onComplete回调

发布于 1周前 作者 itying888 来自 Uni-App

uni-app 申请某个权限并拒绝后 查询该权限无授权弹窗但会立即触发uni.createRequestPermissionListener的onConfirm、onComplete回调

开发环境 版本号 项目创建方式
Windows Windows11 HBuilderX

操作步骤:

使用uni.createRequestPermissionListener监听申请权限,申请某个权限并拒绝,再使用plus.android.requestPermissions查询该权限,无授权弹窗弹出并且会立即触发权限申请监听的onConfirm、onComplete回调

预期结果:

未有授权弹窗弹出时,不应该触发权限申请监听的onConfirm、onComplete回调

实际结果:

未有授权弹窗弹出,触发了权限申请监听的onConfirm、onComplete回调

bug描述:

使用uni.createRequestPermissionListener监听申请权限,申请某个权限并拒绝,再使用plus.android.requestPermissions查询该权限,无授权弹窗弹出并且会立即触发权限申请监听的onConfirm、onComplete回调


6 回复

授权这里,授权弹框一共会弹出两次(除非清除app数据),第一次拒绝之后,不管是再次获取权限还是查询该权限都会再弹出一次,再次永久拒绝,就不会再弹了,设计是这样的


我目前没出现过拒绝授权之后,还能唤起授权弹窗的情况

uni.makePhoneCall拒绝权限后确实会触发一次onConfirm,但是没有权限弹窗

this.listener && this.listener.stop(); this.listener = uni.createRequestPermissionListener(); this.permissions = []; this.isShowPermissionTips = false; this.listener.onRequest((names) => { //即将开始请求权限前的回调,无论权限是否被拒绝过,names是权限数组,如: [“android.permission.CAMERA”] for (let name of names) { let index = this.permissions.findIndex((permission) => permission.name === name); if (index === -1) this.permissions.push({ name, completed: false }); console.log(“onRequest”, name); } }); this.listener.onConfirm((names) => { //即将弹出系统授权弹窗前的回调,如果之前就已经被拒绝的权限,不会进入这个回调。 //假如onRequest中names是4个,其中2个被永久拒绝,那么onConfirm这里的names就是另外2个。 //也就是说,如果进入了这个回调,它肯定就是将要弹窗,然后names就是需要弹窗授权的权限。 for (let name of names) { console.log(“onConfirm”, name); } this.isShowPermissionTips = true; }); this.listener.onComplete((names) => { //如果前面有授权弹窗弹出,到这里时就是已经关闭了。 //在onRequest中出现的权限,也都会在onComplete这里出现,不过onComplete有可能会多次被调用。 for (let name of names) { let permission = this.permissions.find((permission) => permission.name === name); if (permission) permission.completed = true; console.log(“onComplete”, name); } //这里进行判断一下是否全部权限都completed了。 let completedAll = this.permissions.filter((permission) => permission.completed).length === this.permissions.length; if (completedAll) { this.listener.stop(); this.permissions = []; this.isShowPermissionTips = false; } });

如果用户手动修改了权限呢

在 uni-app 中,当你申请某个权限并拒绝后,再次查询该权限时,系统通常会直接返回权限状态,而不会再次弹出授权弹窗。这是因为用户已经明确拒绝了该权限,系统会记住这个选择,并且不会再次打扰用户。

在这种情况下,uni.createRequestPermissionListeneronConfirmonComplete 回调会立即触发,因为系统已经知道用户的选择,不需要再次弹出授权弹窗。

解决思路

  1. 检查权限状态:在申请权限之前,可以先检查当前权限状态。如果权限已经被拒绝,可以提示用户手动去设置中开启权限。

  2. 处理回调逻辑:在 onConfirmonComplete 回调中,根据权限状态执行相应的逻辑。如果权限被拒绝,可以引导用户手动开启权限。

示例代码

// 检查权限状态
uni.getSetting({
  success(res) {
    if (!res.authSetting['scope.userLocation']) {
      // 如果权限未授权,申请权限
      uni.authorize({
        scope: 'scope.userLocation',
        success() {
          console.log('授权成功');
        },
        fail() {
          console.log('授权失败');
          // 如果用户拒绝授权,可以提示用户手动开启
          uni.showModal({
            title: '提示',
            content: '需要位置权限才能使用该功能,是否去设置开启?',
            success(res) {
              if (res.confirm) {
                uni.openSetting({
                  success(res) {
                    console.log('设置页面打开成功');
                  }
                });
              }
            }
          });
        }
      });
    } else {
      console.log('权限已授权');
    }
  }
});

// 监听权限请求
const listener = uni.createRequestPermissionListener({
  onConfirm() {
    console.log('用户确认授权');
  },
  onComplete() {
    console.log('权限请求完成');
  }
});

// 在需要的时候调用
listener.request();
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!