uniapp 统一获取授权提示和48小时间隔授权

应用商店审核要求 获取权限前需要给提示,拒绝之后48小时不能给弹窗授权
项目用的是uniapp

 getImagePermission(v?: string, tag?: any, source?: any, proj?: any) {
   
    // proj = proj || vueSelf.$proj(tag, source);
    let data = {
   
      state: false,//是否原生授权
      denied: true,//是否提示
      permissionList: [
        {
   
          permissionName: "相机",
          tips: "允许应用打开摄像头",
          androidPermission: "android.permission.CAMERA",
        },
        {
   
          permissionName: "相册",
          tips: "允许应用读取存储卡上的照片、媒体内容和文件",
          androidPermission: "android.permission.READ_EXTERNAL_STORAGE",
        },
      ],
    };
   userPermissions(
      JSON.stringify(data), null, null, null,
      function (res) {
   
        console.log("getImagePermission res", res);
        // console.log("getImagePermission back", back);
        // back(res === 1 ? true : false)
        vueSelf.$callback('abAct.getImagePermission', null, res == 1 ? true : false);
      }
    );
	// 这里是因为异步问题,必须写这个
    return true
  },
  _androidPermissions: <any>undefined,

  userPermissions(v?: string, back?: any) {
   
    proj = proj || vueSelf.$proj(tag, source);
    // #ifdef APP
    try {
   
      if (axCc.info.platform == "android") {
   
        let permissionDs: any[] = JSON.parse(v);
        let permissionState = false;
        let permissionDenied = "";
        if (!Array.isArray(permissionDs)) {
   
          // @ts-ignore
          if (Array.isArray(permissionDs.permissionList)) {
   
            // @ts-ignore
            permissionState = permissionDs.state;
            // @ts-ignore
            permissionDenied = permissionDs.denied;
            // @ts-ignore
            permissionDs = permissionDs.permissionList;
          } else {
   
            permissionDs = [permissionDs];
          }
        }

        let androidPermissionsDirty = false;
        let androidPermissions = SdkActs._androidPermissions;
        if (!androidPermissions) {
   
          androidPermissions = axCc.getStorage("_androidPermissions");
          if (typeof androidPermissions !== "object") {
   
            androidPermissions = {
   };
          }

          SdkActs._androidPermissions = androidPermissions;
        }

        let mainActivity: any;
        let nowTime: any;
        let deniedTime: any;
        let deniedPermissions;
        let requestPermissions;
        let nonePermissions = false;
        let tips = "";
        for (let i = permissionDs.length - 1; i >= 0; i--) {
   
          let permissionD = permissionDs[i];
          let permission = permissionD.androidPermission;
          let permissionV = androidPermissions[permission];
          if (permissionV === 1) {
   
            permissionDs.splice(i, 1);
          } else {
   
            mainActivity || (mainActivity = plus.android.runtimeMainActivity());
            if (mainActivity.checkSelfPermission(permission) === 0) {
   
              permissionDs.splice(i, 1);
              androidPermissionsDirty = true;
              androidPermissions[permission] = 1;
            } else {
   
              // 暂停二次授权间隔48小时
              if (!deniedTime) {
   
                nowTime = new Date().getTime();
                deniedTime = nowTime - 48 * 24 * 3600;
              }
              if (permissionV > deniedTime) {
   
                // 暂停二次授权
                (deniedPermissions || (deniedPermissions = [])).push(
                  permissionD
                );
              } else {
   
                if (permissionD.tips && !permissionState) {
   
                  // 可授权提示
                  tips = permissionD.tips + tips;
                  (requestPermissions || (requestPermissions = [])).push(
                    permission
                  );
                } else {
   
                  nonePermissions = true;
                }
              }
            }
          }
        }

        if (androidPermissionsDirty) {
   
          // 权限记录
          androidPermissionsDirty = false;
          axCc.saveStorage("_androidPermissions", androidPermissions);
        }
        if (nonePermissions) {
   
          // 没有授权
          back
            ? back(-1)
            : vueSelf.$callback("abAct.userPermissions", proj, -1);
          return;
        } else if (deniedPermissions) {
   
          // 暂停二次授权
          if (permissionDenied) {
   
            uni.showModal({
   
              title: "提示",
              content: "没有权限",
              showCancel: false,
              complete(result) {
   
                back
                  ? back(-2)
                  : vueSelf.$callback("abAct.userPermissions", proj, -2);
              },
            });

            return true;
          }

          back
            ? back(-2)
            : vueSelf.$callback("abAct.userPermissions", proj, -2);
          return;
        } else if (tips) {
   
          uni.showModal({
   
            title: "权限申请",
            content: tips,
            success(res) {
   
              if (res.confirm) {
   
                // https://www.html5plus.org/doc/zh_cn/android.html#plus.android.requestPermissions
                plus.android.requestPermissions(requestPermissions, (e) => {
   

                  for (let i = e.deniedAlways.length - 1; i >= 0; i--) {
   
                    androidPermissions[e.deniedAlways[i]] = nowTime;
                  }

                  for (let i = e.deniedPresent.length - 1; i >= 0; i--) {
   
                    androidPermissions[e.deniedPresent[i]] = nowTime;
                  }

                  for (let i = e.granted.length - 1; i >= 0; i--) {
   
                    androidPermissions[e.granted[i]] = 1;
                  }

                  axCc.saveStorage("_androidPermissions", androidPermissions);

                  if (e.deniedAlways.length > 0) {
   
                    //权限被永久拒绝
                    // 弹出提示框解释为何需要定位权限,引导用户打开设置页面开启
                    back
                      ? back(-2)
                      : vueSelf.$callback("abAct.userPermissions", proj, -2);
                  } else if (
                    e.deniedPresent.length > 0 ||
                    e.granted.length <= 0
                  ) {
   
                    //权限被临时拒绝
                    // 弹出提示框解释为何需要定位权限,可再次调用plus.android.requestPermissions申请权限
                    back
                      ? back(-1)
                      : vueSelf.$callback("abAct.userPermissions", proj, -1);
                  } else {
   
                    //权限被允许
                    //调用依赖获取定位权限的代码
                    back
                      ? back(1)
                      : vueSelf.$callback("abAct.userPermissions", proj, 1);
                  }
                });
              } else if (res.cancel) {
   
                // 拒接授权
                back
                  ? back(0)
                  : vueSelf.$callback("abAct.userPermissions", proj, 0);
              }
            },
          });

          return true;
        }

        back ? back(1) : vueSelf.$callback("abAct.userPermissions", proj, 1);
        return;
      }
    } catch (e) {
   
      console.error(e);
    }
    // #endif
    back ? back(1) : vueSelf.$callback("abAct.userPermissions", proj, 1);
  },

相关推荐

  1. uniapp 统一获取授权提示48小时间隔授权

    2023-12-23 06:40:06       35 阅读
  2. uniapp 开发App 权限授权 js-sdk

    2023-12-23 06:40:06       33 阅读
  3. 微信授权登录获取用户openid

    2023-12-23 06:40:06       17 阅读
  4. 【身份验证授权比较】

    2023-12-23 06:40:06       35 阅读
  5. uniapp 小程序实现微信授权登录(前端后端)

    2023-12-23 06:40:06       14 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-23 06:40:06       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-23 06:40:06       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-23 06:40:06       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-23 06:40:06       18 阅读

热门阅读

  1. 【Stress-ng】CentOS 7 离线安装Stress-ng

    2023-12-23 06:40:06       43 阅读
  2. 面试建议篇(持续更新....)

    2023-12-23 06:40:06       40 阅读
  3. Redis缓存设计模式与失效策略

    2023-12-23 06:40:06       40 阅读
  4. php pcntl_fork 多进程

    2023-12-23 06:40:06       32 阅读
  5. 在centos上安装python人脸库face_recognition

    2023-12-23 06:40:06       42 阅读
  6. Hive-DDL详解(超详细)

    2023-12-23 06:40:06       33 阅读
  7. WEB渗透—PHP反序列化(七)

    2023-12-23 06:40:06       35 阅读
  8. KAZE+GTM 图像配准标定 Matlab 实现

    2023-12-23 06:40:06       36 阅读
  9. 达梦的SQL脚本转成Oracle的SQL脚本需要注意什么?

    2023-12-23 06:40:06       40 阅读
  10. 阿里云常用配置:日志采集、OSS、RAM 权限策略

    2023-12-23 06:40:06       42 阅读
  11. Android 13 内置可卸载的搜狗输入法

    2023-12-23 06:40:06       49 阅读