当前位置: 首页 > news >正文

Uniapp权限申请优化方案

获取权限前给用户提示,并在用户拒绝后48小时内不再弹窗请求授权。

优化方案分析

您的代码已经实现了基本的权限申请逻辑,但可以进一步优化以满足应用商店的审核要求。

1. 权限申请前的用户提示优化

当前代码中已经包含了权限申请前的提示功能,但可以增强用户体验:

// 优化提示内容,增加更友好的解释
uni.showModal({title: "需要以下权限",content: "为了给您提供更好的服务,我们需要以下权限:\n\n" + "• 相机权限 - 用于拍照上传功能\n" +"• 存储权限 - 用于选择照片和文件\n\n" +"我们承诺严格保护您的隐私安全",success(res) {if (res.confirm) {// 用户同意后申请权限plus.android.requestPermissions(requestPermissions, (e) => {// 处理权限申请结果});} else {// 用户拒绝,记录时间androidPermissions[permission] = new Date().getTime();axCc.saveStorage("_androidPermissions", androidPermissions);}}
});

2. 48小时限制逻辑优化

您的代码中已经实现了48小时限制逻辑,但可以更明确:

// 检查是否在48小时限制期内
const nowTime = new Date().getTime();
const lastDeniedTime = androidPermissions[permission] || 0;
const hours48 = 48 * 60 * 60 * 1000; // 48小时的毫秒数if (lastDeniedTime && (nowTime - lastDeniedTime) < hours48) {// 在48小时内,不再请求return back ? back(-2) : vueSelf.$callback("abAct.userPermissions", proj, -2);
}

3. 权限申请流程优化

建议将权限申请流程分为几个清晰的阶段:

  1. 权限检查阶段:检查是否已有权限
  2. 时间限制检查:检查是否在48小时限制期内
  3. 用户提示阶段:向用户解释权限用途
  4. 权限申请阶段:实际申请权限
  5. 结果处理阶段:处理用户选择

完整优化代码

以下是优化后的代码结构建议(不改变原有逻辑,仅增强可读性和用户体验):

userPermissions(v?: string, back?: any) {proj = proj || vueSelf.$proj(tag, source);// #ifdef APPtry {if (axCc.info.platform == "android") {let permissionDs: any[] = JSON.parse(v);let permissionState = false;let permissionDenied = "";// 解析权限配置if (!Array.isArray(permissionDs)) {if (Array.isArray(permissionDs.permissionList)) {permissionState = permissionDs.state;permissionDenied = permissionDs.denied;permissionDs = permissionDs.permissionList;} else {permissionDs = [permissionDs];}}// 初始化权限存储let androidPermissions = SdkActs._androidPermissions;if (!androidPermissions) {androidPermissions = axCc.getStorage("_androidPermissions") || {};SdkActs._androidPermissions = androidPermissions;}const mainActivity = plus.android.runtimeMainActivity();const nowTime = new Date().getTime();const HOURS_48_MS = 48 * 60 * 60 * 1000;// 过滤已授权和受限权限let requestPermissions = [];let needExplain = false;let explanation = "";for (let permissionD of permissionDs) {const permission = permissionD.androidPermission;// 已授权检查if (androidPermissions[permission] === 1 || mainActivity.checkSelfPermission(permission) === 0) {androidPermissions[permission] = 1;continue;}// 48小时限制检查const lastDeniedTime = androidPermissions[permission] || 0;if (lastDeniedTime && (nowTime - lastDeniedTime) < HOURS_48_MS) {if (permissionDenied) {return showDeniedModal(back, proj);}return back ? back(-2) : vueSelf.$callback("abAct.userPermissions", proj, -2);}// 准备请求的权限requestPermissions.push(permission);if (permissionD.tips && !permissionState) {explanation += `${permissionD.tips}\n`;needExplain = true;}}// 保存更新的权限状态axCc.saveStorage("_androidPermissions", androidPermissions);// 处理需要请求的权限if (requestPermissions.length === 0) {return back ? back(1) : vueSelf.$callback("abAct.userPermissions", proj, 1);}if (needExplain) {return showPermissionExplanation(explanation, requestPermissions, back, proj);}// 直接请求权限return requestAndroidPermissions(requestPermissions, back, proj);}} catch (e) {console.error(e);}// #endifreturn back ? back(1) : vueSelf.$callback("abAct.userPermissions", proj, 1);
}// 辅助函数:显示拒绝后的提示
function showDeniedModal(back, proj) {uni.showModal({title: "提示",content: "您已拒绝授权,48小时内将不再提示",showCancel: false,complete() {back ? back(-2) : vueSelf.$callback("abAct.userPermissions", proj, -2);}});return true;
}// 辅助函数:显示权限解释
function showPermissionExplanation(explanation, permissions, back, proj) {uni.showModal({title: "权限申请",content: "我们需要以下权限来提供完整服务:\n\n" + explanation,success(res) {if (res.confirm) {requestAndroidPermissions(permissions, back, proj);} else {recordDeniedPermissions(permissions);back ? back(0) : vueSelf.$callback("abAct.userPermissions", proj, 0);}}});return true;
}// 辅助函数:记录被拒绝的权限
function recordDeniedPermissions(permissions) {const nowTime = new Date().getTime();const androidPermissions = SdkActs._androidPermissions || {};permissions.forEach(p => {androidPermissions[p] = nowTime;});axCc.saveStorage("_androidPermissions", androidPermissions);SdkActs._androidPermissions = androidPermissions;
}// 辅助函数:实际请求权限
function requestAndroidPermissions(permissions, back, proj) {plus.android.requestPermissions(permissions, (e) => {const androidPermissions = SdkActs._androidPermissions || {};const nowTime = new Date().getTime();// 处理授权结果e.deniedAlways.concat(e.deniedPresent).forEach(p => {androidPermissions[p] = nowTime;});e.granted.forEach(p => {androidPermissions[p] = 1;});axCc.saveStorage("_androidPermissions", androidPermissions);SdkActs._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) {back ? back(-1) : vueSelf.$callback("abAct.userPermissions", proj, -1);} else {back ? back(1) : vueSelf.$callback("abAct.userPermissions", proj, 1);}});return true;
}

注意事项

  1. 华为应用市场特殊要求:华为应用市场特别强调在调用终端权限时应同步告知用户申请该权限的目的。建议在提示信息中明确说明权限用途。

  2. 权限分组处理:Android将危险权限分为不同的权限组,当用户授予某个组的一个权限时,该组中的其他权限也会自动获得授权。可以利用这一点优化权限申请策略。

  3. 用户体验优化:可以考虑使用更美观的自定义弹窗来替代系统默认的权限申请界面,但核心逻辑保持不变。

  4. 隐私政策合规:确保您的应用符合各大应用市场的隐私政策要求,特别是关于权限说明的部分。

  5. 测试验证:使用HBuilderX 4.01及以上版本测试时,Vue2项目需要使用自定义基座测试监听权限申请的功能,标准基座暂不支持测试。

通过以上优化,您的权限申请逻辑将更符合应用商店的审核要求,同时提供更好的用户体验。

相关文章:

  • Browser-use 是连接你的AI代理与浏览器的最简单方式
  • 什么是跨域问题以及其解决方案
  • mac上面使用zip命令压缩一劳永逸
  • 逆周期中的“深潜者”样本,解码康佳“智造”破局密码
  • Spark-SQL(二)
  • 轻量级Python IDE使用(五)——条件分支
  • STM32F103_HAL库+寄存器学习笔记15 - 梳理CAN发送失败时,涉及哪些寄存器
  • Linux:Ext系列文件系统
  • Python网络爬虫设计(一)
  • 牛客月赛114
  • DDS函数信号发生器设计
  • Redis之RedLock算法以及底层原理
  • YOLOv2学习笔记
  • 实战指南:封装Whisper为FastAPI接口并实现高并发处理-附整合包
  • 案例驱动的 IT 团队管理:创新与突破之路:第四章 危机应对:从风险预见到创新破局-4.2 人才流失危机-4.2.3梯队建设的“洋葱模型“
  • 【MySQL】
  • 阿里FPGA XCKU3P开箱- 25G 光纤
  • 鸿蒙NEXT开发全局上下文管理类(ArkTs)
  • 进程的查看与属性
  • java分页实例
  • 中保协:当前普通型人身保险产品预定利率研究值为2.13%
  • 五一假期出行预订进入高潮:酒店搜索热度翻倍,“请4休11”拼假带动长线游
  • 坚定信心主动应变局谋发展,上海市领导走访调研外资外贸企业
  • “替父追债被判寻衅滋事案”从犯获国赔,该案司法机关共赔偿217万元
  • 商务部:对原产于日本的进口电解电容器纸继续征收反倾销税
  • 6名驴友庐山西海探险走失被追缴2万救援费,组织者被追缴4千