uni-app ermissionExternalStorage设置为always,用户拒绝后会一直导致在开屏页卡住

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

uni-app ermissionExternalStorage设置为always,用户拒绝后会一直导致在开屏页卡住
permissionExternalStorage设置为always,用户拒绝,再勾选拒绝且不再询问后,跳转到设置界面,此时不做任何设置,杀掉app,重新打开app,页面卡在开屏页,没有任务提示。怎么解决呢

有很多人和我一样的遭遇,问题帖子: https://ask.dcloud.net.cn/article/36549#externalstorage


1 回复

在处理 uni-apppermissionExternalStorage 设置为 always 时用户拒绝权限请求导致应用卡住的问题,我们需要确保应用在用户拒绝权限后能够有合理的降级处理机制,而不是无限期地卡住开屏页。以下是一个处理这种情况的代码示例,通过使用条件判断和异步请求权限的方式来实现。

首先,确保你的 manifest.json 文件中已经声明了存储权限:

"mp-weixin": { // 以微信小程序为例,其他平台类似
  "permission": {
    "scope.userLocation": {
      "desc": "你的位置信息将用于小程序存储功能"
    }
    // 注意:这里的scope.userLocation仅为示例,实际应为存储相关权限描述,但微信小程序不直接管理存储权限,需通过用户授权文件访问
  }
}

然后,在你的 uni-app 项目中,可以使用以下代码逻辑来处理权限请求和拒绝的情况:

// 假设在开屏页(splash.vue)中进行权限请求
export default {
  mounted() {
    this.requestStoragePermission();
  },
  methods: {
    async requestStoragePermission() {
      try {
        // 注意:uni-app没有直接的always权限设置API,这里模拟请求存储权限的逻辑
        // 实际应根据你的平台(如Android、iOS)使用相应的原生插件或API
        const hasPermission = await uni.getSetting({
          success: (res) => {
            return res.authSetting['scope.writePhotosAlbum'] || false; // 示例权限,实际应替换为存储权限
          }
        });

        if (!hasPermission) {
          uni.authorize({
            scope: 'scope.writePhotosAlbum', // 示例权限,替换为实际存储权限
            success: () => {
              // 用户同意授权,继续执行后续操作
              this.navigateToMainPage();
            },
            fail: () => {
              // 用户拒绝授权,执行降级处理
              uni.showModal({
                title: '提示',
                content: '您拒绝了存储权限,某些功能可能无法正常使用。',
                showCancel: false,
                success: (res) => {
                  if (res.confirm) {
                    // 跳转到主页面或其他无需该权限的页面
                    this.navigateToMainPageWithoutPermission();
                  }
                }
              });
            }
          });
        } else {
          // 已经有权限,直接跳转
          this.navigateToMainPage();
        }
      } catch (error) {
        console.error('请求权限失败:', error);
        // 处理请求权限失败的情况,如跳转到错误页面或重试逻辑
      }
    },
    navigateToMainPage() {
      uni.navigateTo({
        url: '/pages/main/main'
      });
    },
    navigateToMainPageWithoutPermission() {
      uni.navigateTo({
        url: '/pages/main/mainNoPermission' // 跳转到无需该权限的页面
      });
    }
  }
}

上述代码在开屏页加载时请求存储权限,如果用户拒绝,则显示提示信息并跳转到无需该权限的页面,从而避免应用卡住。注意,uni-app 本身不直接管理所有平台的权限,对于特定平台(如Android、iOS),可能需要使用原生插件或相应平台的API来实现更细粒度的权限管理。

回到顶部