uni-app 安装应用后进入无授权选项直接弹出授权提示弹窗 设置里允许权限后仍弹出

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

uni-app 安装应用后进入无授权选项直接弹出授权提示弹窗 设置里允许权限后仍弹出

类别 信息
产品分类 uniapp/App
PC开发环境 Windows
PC版本号 Windows 11 家庭中文版 23H2
HBuilderX 正式
HBuilderX版本 4.31
手机系统 Android
手机版本号 Android 14
手机厂商 realme
手机机型 RMX3366
页面类型 vue
vue版本 vue3
打包方式 云端
项目创建方式 HBuilderX

操作步骤:

设置targetSdkVersion值为34。 在realme手机上:安装应用后进入应用,没有授权选项,直接弹出需要授权的提示弹窗,在设置里把所有权限都设置为允许后,还是弹出需要授权的提示弹窗。 另一台小米手机上:安装应用后进入应用,弹窗授权,用户拒绝,再勾选拒绝且不再询问后,跳转到设置界面,此时不做任何设置,杀掉app,重新打开app,页面卡在开屏页,没有任何提示。

预期结果:

设置targetSdkVersion值为34。 在realme手机上:安装应用后进入应用,没有授权选项,直接弹出需要授权的提示弹窗,在设置里把所有权限都设置为允许后,还是弹出需要授权的提示弹窗。 另一台小米手机上:安装应用后进入应用,弹窗授权,用户拒绝,再勾选拒绝且不再询问后,跳转到设置界面,此时不做任何设置,杀掉app,重新打开app,页面卡在开屏页,没有任何提示。

实际结果:

设置targetSdkVersion值为34。 在realme手机上:安装应用后进入应用,没有授权选项,直接弹出需要授权的提示弹窗,在设置里把所有权限都设置为允许后,还是弹出需要授权的提示弹窗。 另一台小米手机上:安装应用后进入应用,弹窗授权,用户拒绝,再勾选拒绝且不再询问后,跳转到设置界面,此时不做任何设置,杀掉app,重新打开app,页面卡在开屏页,没有任何提示。

bug描述:

设置targetSdkVersion值为34。 在realme手机上:安装应用后进入应用,没有授权选项,直接弹出需要授权的提示弹窗,在设置里把所有权限都设置为允许后,还是弹出需要授权的提示弹窗。 另一台小米手机上:安装应用后进入应用,弹窗授权,用户拒绝,再勾选拒绝且不再询问后,跳转到设置界面,此时不做任何设置,杀掉app,重新打开app,页面卡在开屏页,没有任何提示。

image

video1.zip


2 回复

你可以打包一个空项目,运行在你的realme和小米上,有问题吗?
如果没问题,再排查是你的代码还是你用的三方插件调用了。 你也可以找应用商店要权限调用堆栈,看看是谁申请了这个本地文件权限。


在处理 uni-app 中权限授权的问题时,我们需要确保在用户未授权时弹出授权提示,并在用户授权后不再重复弹出。这通常涉及到检查权限状态、请求权限以及处理权限结果的逻辑。以下是一个示例代码,展示了如何在 uni-app 中实现这一功能。

首先,确保你已经在 manifest.json 中声明了需要的权限,例如相机和存储权限:

"mp-weixin": {
  "requiredPrivateInfos": ["getUserInfo", "getPhoneNumber"]
},
"plus": {
  "distribute": {
    "android": {
      "permissions": [
        "android.permission.CAMERA",
        "android.permission.WRITE_EXTERNAL_STORAGE"
      ]
    },
    "ios": {
      "plist": [
        "NSCameraUsageDescription",
        "NSPhotoLibraryUsageDescription"
      ]
    }
  }
}

然后,在你的页面或组件中,使用以下代码逻辑来检查和请求权限:

export default {
  onLoad() {
    this.checkPermissions();
  },
  methods: {
    checkPermissions() {
      const permissions = ['camera', 'writeExternalStorage']; // 根据需要添加更多权限
      permissions.forEach(permission => {
        if (!this.hasPermission(permission)) {
          this.requestPermission(permission).then(res => {
            if (res.authResult === 'grant') {
              console.log(`${permission} 权限已授权`);
            } else {
              console.log(`${permission} 权限未授权`);
              // 可以在这里显示一个提示,引导用户去设置中授权
              uni.showModal({
                title: '提示',
                content: `${permission} 权限未授权,请前往设置授权`,
                showCancel: false,
                success: function (res) {
                  if (res.confirm) {
                    uni.openSetting();
                  }
                }
              });
            }
          }).catch(err => {
            console.error(err);
          });
        }
      });
    },
    hasPermission(permission) {
      return plus.android.checkPermission(permission) === plus.android.PERMISSION_GRANTED ||
             uni.getSettingInfoSync().authSetting[permission] === true;
    },
    requestPermission(permission) {
      return new Promise((resolve, reject) => {
        if (plus.os.name === 'Android') {
          plus.android.requestPermissions([permission], (event) => {
            const authResult = event.deniedAlways.indexOf(permission) === -1 ? 'grant' : 'deny';
            resolve({ authResult });
          }, (e) => {
            reject(e);
          });
        } else {
          uni.authorize({
            scope: permission,
            success: (res) => {
              resolve({ authResult: 'grant' });
            },
            fail: (err) => {
              resolve({ authResult: 'deny' });
            }
          });
        }
      });
    }
  }
};

这个示例代码在 onLoad 生命周期中调用 checkPermissions 方法,该方法会遍历所有需要检查的权限。如果权限未授权,则调用 requestPermission 方法请求权限,并根据授权结果进行相应的处理。注意,对于 Android 和 iOS 平台,权限请求的方式有所不同,因此需要根据平台进行判断。

回到顶部