小工具知识网

当前位置: 首页 > 行业知识 > uniapp 安卓,ios 相机权限,华为审核被拒解决方案

行业知识

uniapp 安卓,ios 相机权限,华为审核被拒解决方案

2026-11-02 10:50:14 来源:互联网转载

背景:上架华为被拒了 

        1.您的应用在运行时,未同步告知权限申请的使用目的,向用户索取(相机、存储)等权限,不符合华为应用市场审核标准。

测试步骤:点击我的-投诉反馈-上传附件-拍摄/从相册选择,申请相机、存储权限。点击我的钱包-充值-上传转款凭证-拍摄/从相册选择,申请相机、存储权限。

【文献参考】App权限判断和提示 - DCloud 插件市场

解决方案:permission.js 和getAuth.js

permission.js 完整代码

var isIos  // #ifdef APP-PLUS  isIos = (plus.os.name == "iOS")  // #endif    // 判断推送权限是否开启  function judgeIosPermissionPush() {      var result = false;      var UIApplication = plus.ios.import("UIApplication");      var app = UIApplication.sharedApplication();      var enabledTypes = 0;      if (app.currentUserNotificationSettings) {          var settings = app.currentUserNotificationSettings();          enabledTypes = settings.plusGetAttribute("types");          console.log("enabledTypes1:" + enabledTypes);          if (enabledTypes == 0) {              console.log("推送权限没有开启");          } else {              result = true;              console.log("已经开启推送功能!")          }          plus.ios.deleteObject(settings);      } else {          enabledTypes = app.enabledRemoteNotificationTypes();          if (enabledTypes == 0) {              console.log("推送权限没有开启!");          } else {              result = true;              console.log("已经开启推送功能!")          }          console.log("enabledTypes2:" + enabledTypes);      }      plus.ios.deleteObject(app);      plus.ios.deleteObject(UIApplication);      return result;  }    // 判断定位权限是否开启  function judgeIosPermissionLocation() {      var result = false;      var cllocationManger = plus.ios.import("CLLocationManager");      var status = cllocationManger.authorizationStatus();      result = (status != 2)      console.log("定位权限开启:" + result);      // 以下代码判断了手机设备的定位是否关闭,推荐另行使用方法 checkSystemEnableLocation      /* var enable = cllocationManger.locationServicesEnabled();      var status = cllocationManger.authorizationStatus();      console.log("enable:" + enable);      console.log("status:" + status);      if (enable && status != 2) {          result = true;          console.log("手机定位服务已开启且已授予定位权限");      } else {          console.log("手机系统的定位没有打开或未给予定位权限");      } */      plus.ios.deleteObject(cllocationManger);      return result;  }    // 判断麦克风权限是否开启  function judgeIosPermissionRecord() {      var result = false;      var avaudiosession = plus.ios.import("AVAudioSession");      var avaudio = avaudiosession.sharedInstance();      var permissionStatus = avaudio.recordPermission();      console.log("permissionStatus:" + permissionStatus);      if (permissionStatus == 1684369017 || permissionStatus == 1970168948) {          console.log("麦克风权限没有开启");      } else {          result = true;          console.log("麦克风权限已经开启");      }      plus.ios.deleteObject(avaudiosession);      return result;  }    // 判断相机权限是否开启  function judgeIosPermissionCamera() {      var result = false;      var AVCaptureDevice = plus.ios.import("AVCaptureDevice");      var authStatus = AVCaptureDevice.authorizationStatusForMediaType('vide');      console.log("authStatus:" + authStatus);      if (authStatus == 3) {          result = true;          console.log("相机权限已经开启");      } else {          console.log("相机权限没有开启");      }      plus.ios.deleteObject(AVCaptureDevice);      return result;  }    // 判断相册权限是否开启  function judgeIosPermissionPhotoLibrary() {      var result = false;      var PHPhotoLibrary = plus.ios.import("PHPhotoLibrary");      var authStatus = PHPhotoLibrary.authorizationStatus();      console.log("authStatus:" + authStatus);      if (authStatus == 3) {          result = true;          console.log("相册权限已经开启");      } else {          console.log("相册权限没有开启");      }      plus.ios.deleteObject(PHPhotoLibrary);      return result;  }    // 判断通讯录权限是否开启  function judgeIosPermissionContact() {      var result = false;      var CNContactStore = plus.ios.import("CNContactStore");      var cnAuthStatus = CNContactStore.authorizationStatusForEntityType(0);      if (cnAuthStatus == 3) {          result = true;          console.log("通讯录权限已经开启");      } else {          console.log("通讯录权限没有开启");      }      plus.ios.deleteObject(CNContactStore);      return result;  }    // 判断日历权限是否开启  function judgeIosPermissionCalendar() {      var result = false;      var EKEventStore = plus.ios.import("EKEventStore");      var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(0);      if (ekAuthStatus == 3) {          result = true;          console.log("日历权限已经开启");      } else {          console.log("日历权限没有开启");      }      plus.ios.deleteObject(EKEventStore);      return result;  }    // 判断备忘录权限是否开启  function judgeIosPermissionMemo() {      var result = false;      var EKEventStore = plus.ios.import("EKEventStore");      var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(1);      if (ekAuthStatus == 3) {          result = true;          console.log("备忘录权限已经开启");      } else {          console.log("备忘录权限没有开启");      }      plus.ios.deleteObject(EKEventStore);      return result;  }    // Android权限查询  function requestAndroidPermission(permissionID) {      return new Promise((resolve, reject) => {          plus.android.requestPermissions(              permissionID.split(","),              // [permissionID], // 理论上支持多个权限同时查询,但实际上本函数封装只处理了一个权限的情况。有需要的可自行扩展封装              function(resultObj) {                  var result = 0;                  for (var i = 0; i  {          let plat = isIos ? "ios" : "android";          if (isIos) { // ios              // const camera = permission.judgeIosPermission("camera");//判断ios是否给予摄像头权限              // //ios相册没权限,系统会自动弹出授权框              // //let photoLibrary = permission.judgeIosPermission("photoLibrary");//判断ios是否给予相册权限              // if(camera){              //     resolve();              // }else{              //     reject('需要开启相机使用权限');              // }              resolve(1)          } else { // android              let permission_arr = permissionMap[plat][permission]["name"].split(",");              let flag = true;              for(let i = 0;i {                      view.close();                      if (res == -1) {                          uni.showModal({                              title: '提示',                              content: '操作权限已被拒绝,请手动前往设置',                              confirmText: "立即设置",                              success: (res) => {                                  if (res.confirm) {                                      gotoAppPermissionSetting()                                  }                              }                          })                      }                      resolve(res)                  })              } else {                  resolve(1)              }          }      })  }      module.exports = {      judgeIosPermission: judgeIosPermission,      requestAndroidPermission: requestAndroidPermission,      checkSystemEnableLocation: checkSystemEnableLocation,      gotoAppPermissionSetting: gotoAppPermissionSetting,      premissionCheck: premissionCheck  }

getAuth.js完整代码

import permision from "@/js_sdk/wa-permission/permission.js"/** * 获取手机摄像头和图册权限 * */const cameraAuthority = () => {return new Promise(async (rel, rej) => {var platform =  uni.getSystemInfoSync().platform || 'android';if (platform == 'ios') {let camera = permision.judgeIosPermission("camera");//判断ios是否给予摄像头权限//ios相册没权限,系统会自动弹出授权框//let photoLibrary = permision.judgeIosPermission("photoLibrary");//判断ios是否给予相册权限if (camera) {rel();} else {rej('需要开启相机使用权限');}} else {// console.log('安卓')let camera = await permision.requestAndroidPermission("android.permission.CAMERA");//判断安卓是否给予摄像头权限let photoLibrary = await permision.requestAndroidPermission("android.permission.READ_EXTERNAL_STORAGE");//判断安卓是否给予相册权限console.log('安卓',camera,photoLibrary)// if (camera == 0 || photoLibrary == 0) {// rej('请同时开启相机和相册的使用权限');// } else if (camera == -1 || photoLibrary == -1) {// //永久拒绝// rej(false)// } else {// rel();// }}})}/** * 限安卓 * 是否打开了手机定位 * */const adressOpen = () => {return permision.checkSystemEnableLocation();}/** * 限安卓 * 获取位置信息权限 * */const adressAuthority = () => {return new Promise(async (rel, rej) => {let adress = await permision.requestAndroidPermission("android.permission.ACCESS_FINE_LOCATION");//判断安卓是否有获取位置信息权限if (adress == 0) {rej('请开启定位权限');} else if (adress == -1) {//永久拒绝rej(false)} else {rel();}})}/** * 限安卓 * 获取拨打电话权限 * */const cellPhoneAuthority = () => {return new Promise(async (rel, rej) => {let adress = await permision.requestAndroidPermission("android.permission.CALL_PHONE");//拨打电话权限if (adress == 0) {rej('请开启拨打电话权限');} else if (adress == -1) {//永久拒绝rej(false)} else {rel();}})}/** * 跳转到手机开启权限的界面 * */const permissionSetting = () => {permision.gotoAppPermissionSetting();}export {cameraAuthority,permissionSetting,adressAuthority,adressOpen,cellPhoneAuthority}

调用:

                    const app = getApp();import { cameraAuthority, permissionSetting } from "@/static/js/getAuth.js";import permision from "@/js_sdk/wa-permission/permission.js";export default {props: {zb_file_show: {type: Boolean,default: false,},count: {type: Number,default: 10000},is_limit: {type: Boolean,default: false,}},data() {return {url: [],};},created() { },methods: {clearImg(index) {this.url.splice(index, 1);this.$emit('clearImg')},async selectImg() {// 文档参考 https://blog.csdn.net/m0_46978096/article/details/116784053let _this = this;let platform = uni.getSystemInfoSync().platform;/*#ifdef APP-PLUS*/console.log('APP端:', platform)const isIosTrue = uni.getStorageSync('iosFirstCamera'); //是不是第一次开启相机//ios要先调用一下功能后,设置的权限列表里才会有该权限 ios和android分开判断if (platform == 'ios') {if (isIosTrue == 'false') {console.log('不是第一次')cameraAuthority().then(e => {console.log(e,'then')_this.uploadImg();}).catch(e => {console.log(e, 'catch');uni.showModal({title: '提示',content: '请先开启相机权限',success: function (res) {if (res.confirm) {permissionSetting();}}});})} else {console.log('是第一次')uni.setStorageSync('iosFirstCamera', 'false'); //设为false就代表不是第一次开启相机_this.uploadImg();}} else {var result = await  permision.premissionCheck("CAMERA_EXTERNAL_STORAGE");console.log(result,'result')if (result == 1) {// 此处处理各自业务 如:uni.chooseImage  console.log('有权限');_this.uploadImg();}}/*#endif*//*#ifdef MP*/console.log('微信小程序端')_this.uploadImg();/*#endif*/},uploadImg() {// 获取年月日let year = new Date().getFullYear();let month = new Date().getMonth() + 1;let day = new Date().getDate();month = month  

ios 需要修改mainfest文件:

 /* ios打包配置 */            "ios" : {                "dSYMs" : false,                "idfa" : false,                "privacyDescription" : {                    // 可选,字符串类型,系统相册读取权限描述                    "NSPhotoLibraryUsageDescription" : "APP需要您的同意才能访问相册,以便于上传图片",                    //可选,字符串类型,系统相册写入权限描述                    "NSPhotoLibraryAddUsageDescription" : "APP需要您的同意才能添加图片,以便于上传图片",                    //可选,字符串类型,摄像头使用权限描述                    "NSCameraUsageDescription" : "APP需要您的同意才能访问相机,以便于上传图片,若不允许,您将无法使用上传功能"                }            },

运行效果:

video(10)

华为审核被拒,解决方案

上一篇:揭秘开源驱动源码,探寻开源世界的动力之源!

下一篇:万网域名怎么注册?