关于华为应用市场上架需要同步告知使用权限的解决方案(uniapp适用,原生开发思路同理),直接复制粘贴!

本文主要是介绍关于华为应用市场上架需要同步告知使用权限的解决方案(uniapp适用,原生开发思路同理),直接复制粘贴!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

最近华为应用市场审核的时候加了一条新规具体如下:

您的应用在运行时,未同步告知权限申请的使用目的,向用户索取(存储、相机、位置信息)等权限,不符合华为应用市场审核标准。
测试步骤:点击在线聊-拍照/图片,申请存储、相机权限;点击首页-地图找房,申请位置信息权限。
修改建议:APP在调用终端敏感权限时,应同步说明权限申请的使用目的,包括但不限于申请权限的名称、服务的具体功能、用途;告知方式不限于弹窗、蒙层、浮窗、或者自定义操作系统权限弹框等。请排查应用内所有权限申请行为,确保均符合要求。
请参考《审核指南》第7.21相关审核要求:https://developer.huawei.com/consumer/cn/doc/app/50104-07#h3-1683701612940-2
APP常见个人信息保护问题FAQ请参考:https://developer.huawei.com/consumer/cn/doc/app/FAQ-faq-05#h1-1698326401789-0
测试环境:Wi-Fi联网、HonmonyOS 2.0(Nova5)、中文环境。

我在本篇博客说说简单的处理方式,网上其他人写的太复杂了,亲测可上线

先看效果

在这里插入图片描述

封装权限判断工具类

新建一个authorizeUtils.ts文件,直接无脑复制如下代码:

const checkIsIos = async () => {return new Promise((resolve => {uni.getSystemInfo({success: function (res) {resolve(systemInfo.value.platform === "ios")}});}))
}
export default class authorizeUtils {/*** 授权前告知用户使用意图* @param content * @returns */static showAuthTipModal = async (authorize: string) => {// #ifdef H5if (1 === 1) {return true}// #endif// ios端在manifest.json配置权限使用说明,以下权限判断仅在安卓端可用let isIos = await checkIsIos()if (isIos) return truelet compat: any = plus.android.importClass('androidx.core.content.ContextCompat')let context = plus.android.runtimeMainActivity()let result = compat.checkSelfPermission(context, authorize)console.log("result===", result);if (result === 0) return true// // 如果已经授权直接返回const contentData = {['android.permission.ACCESS_FINE_LOCATION']: {title: "定位权限说明",describe: "便于您使用该功能在地图找房中根据您的位置检索附近的房源,请您确认授权,否则无法使用该功能"},["android.permission.READ_EXTERNAL_STORAGE"]: {title: "相册权限说明",describe: "便于您使用该功能上传您的照片/图片/视频及用户实名认证信息、发布房源时上传图片,请您确认授权,否则无法使用该功能"},["android.permission.CAMERA"]: {title: "拍摄权限说明",describe: "便于您使用该功能拍摄身份证、房源、头像、房产证等信息,请您确认授权,否则无法使用该功能"},["android.permission.CALL_PHONE"]: {title: "拨打电话权限说明",describe: "便于您使用该功能拨打房东、经纪人、管家、客服电话,请您确认授权,否则无法使用该功能"},}return new Promise((resolve) => {uni.showModal({title: contentData[authorize].title,content: contentData[authorize].describe,success: (res) => {resolve(!!res.confirm)},fail: () => {}})})}/*** 用户拒绝授权提示手动授权*/static showManualAuth = async (authorize: string) => {let isIos = await checkIsIos()if (isIos) return trueconst contentData = {['android.permission.ACCESS_FINE_LOCATION']: "获取定位权限失败,请手动打开授权或检查系统定位开关",["android.permission.READ_EXTERNAL_STORAGE"]: "获取相册权限失败,请手动打开授权",["android.permission.CAMERA"]: "获取拍摄权限失败,请手动打开授权",["android.permission.CALL_PHONE"]: "获取拨打电话权限失败,请手动打开授权",}uni.showModal({title: '提示',content: contentData[authorize],confirmText: "去设置",success: (res) => {if (res.confirm) {uni.openAppAuthorizeSetting({success(res) {console.log(res);}});}if (res.cancel) {console.log('用户点击取消');}}});}
}

工具类的使用示例

拨打电话示例:

   // 检查是否授权拨打电话权限let flag = await authorizeUtils.showAuthTipModal("android.permission.CALL_PHONE")// 用户拒绝授权if (!flag) returnuni.makePhoneCall({phoneNumber, fail: () => {// 权限开启失败提示用户手动打开权限authorizeUtils.showManualAuth("android.permission.CALL_PHONE")}});

获取用户位置信息示例:

    getUserLocation = async (): Promise<null | { longitude: number, latitude: number }> => {return new Promise(async (resolve) => {let authFlag = await authorizeUtils.showAuthTipModal("android.permission.ACCESS_FINE_LOCATION")if (!authFlag) return resolve(null)uni.getLocation({type: "wgs84",success: ({ longitude, latitude }) => {return resolve({ longitude, latitude })},fail: (fail) => {this.hideLoading()authorizeUtils.showManualAuth("android.permission.ACCESS_FINE_LOCATION")return resolve(null)}});})}

注意

app端选择图片方法chooseImage,默认是弹出选项拍照和从相册选择,但是拍照和从相册选择是两种不同的权限,所以这个弹出选项需要自己手动写,用户选择拍照就请求相机权限,从相册选择就请求存储权限,我这边附上我的代码,仅供参考:

const handleUpload = async (openType: "camera" | "album") => {if (props.disabled) return;// #ifdef APP-PLUSconst permissionType = openType === "album" ? "android.permission.READ_EXTERNAL_STORAGE" : "android.permission.CAMERA";let authFlag = await authorizeUtils.showAuthTipModal(permissionType);if (!authFlag) return;// #endifuni.chooseImage({sourceType: [openType],count: props.limit,success: async (success) => {},fail: (fail) => {if ([0, 11, 12].includes(fail.code)) return;authorizeUtils.showManualAuth(permissionType);}});
};

安卓权限列表

// android.permission.ACCESS_FINE_LOCATION	位置权限
// android.permission.ACCESS_COARSE_LOCATION	模糊位置权限(蓝牙\ble依赖)
// android.permission.CAMERA	摄像头权限
// android.permission.READ_EXTERNAL_STORAGE	外部存储(含相册)读取权限
// android.permission.WRITE_EXTERNAL_STORAGE	外部存储(含相册)写入权限
// android.permission.RECORD_AUDIO	麦克风权限
// android.permission.READ_CONTACTS	通讯录读取权限
// android.permission.WRITE_CONTACTS	通讯录写入权限
// android.permission.READ_CALENDAR	日历读取权限
// android.permission.WRITE_CALENDAR	日历写入权限
// android.permission.READ_SMS	短信读取权限
// android.permission.SEND_SMS	短信发送权限
// android.permission.RECEIVE_SMS	接收新短信权限
// android.permission.READ_PHONE_STATE	获取手机识别码等信息的权限
// android.permission.CALL_PHONE	拨打电话权限
// android.permission.READ_CALL_LOG	获取通话记录权限

总结

打工人何苦为难打工人!!

这篇关于关于华为应用市场上架需要同步告知使用权限的解决方案(uniapp适用,原生开发思路同理),直接复制粘贴!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/603713

相关文章

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数