当前位置:   article > 正文

uniApp应用软件在运行时,未见向用户告知权限申请的目的,向用户索取(存储、相机、电话)等权限,不符合华为应用市场审核标准。_应用在运行时,未同步告知权限申请的使用目的,向用户索取(相机、存储、电话、位置)

应用在运行时,未同步告知权限申请的使用目的,向用户索取(相机、存储、电话、位置)

根据应用市场审核标准。我们开发的软件想要过审就必须要在应用在运行时,向用户告知权限申请的目的,向用户索取(存储、相机、电话)等权限!!

但是我们会发现做了提示弹框后又会驳回弹窗评频繁弹窗等等一系列的问题出来。

关于权限申请最终解决方案我也是问过了官方人员:

 

由此可见最好的解决方案便是:应同步告知用户申请该权限的目的,那么我们应该怎么做呐?

首先在uniApp项目中创建一个vuex:

  1. // main.js vue3
  2. // #ifdef VUE3
  3. import store from './store'
  4. import { createSSRApp } from 'vue'
  5. export function createApp() {
  6. const app = createSSRApp(App)
  7. app.use(store)
  8. return {
  9. app
  10. }
  11. }
  12. // #endif

 创建store

  1. // 页面路径:store/index.js
  2. import {
  3. createStore
  4. } from 'vuex'
  5. const store = createStore({
  6. // 初始化状态
  7. state: {
  8. // 处理应用程序权限请求
  9. CAMERA:false,
  10. WRITE_EXTERNAL_STORAGE: false,
  11. ACCESS_FINE_LOCATION: false,
  12. CALL_PHONE: false,
  13. /* #ifdef APP-PLUS */
  14. isIos: plus.os.name == "iOS",
  15. /* #endif */
  16. mapping: {
  17. 'CAMERA': {
  18. title: "摄像头权限说明",
  19. content: "摄像头权限将用于拍摄照片和视频。这样,您可以在应用程序中记录瞬间、分享内容或进行其他相关操作。",
  20. methods: 'SET_CAMERA'
  21. },
  22. 'WRITE_EXTERNAL_STORAGE': {
  23. title: "****对存储空间/照片权限申请说明",
  24. content: "便于您使用该功能上传您的照片/图片/视频及用于更换头像、发布商品/分享、下载、与客服沟通等场景中读取和写入相册和文件内容。",
  25. methods: 'SET_WRITE_EXTERNAL_STORAGE'
  26. },
  27. 'ACCESS_FINE_LOCATION': {
  28. title: "****对地理位置权限申请说明",
  29. content: "****应用程序可以提供基于位置的服务、定位导航、附近搜索等功能。",
  30. methods: 'SET_ACCESS_FINE_LOCATION'
  31. },
  32. 'CALL_PHONE': {
  33. title: "****拨打/管理电话权限申请说明",
  34. content: "便于您使用该功能联系买家、骑手或者客服、业务经理与联系等场景下使用",
  35. methods: 'SET_CALL_PHONE'
  36. }
  37. }
  38. },
  39. mutations: {
  40. // 管理权限告知目的
  41. SET_CAMERA(state, val) {
  42. state.CAMERA = val
  43. },
  44. SET_WRITE_EXTERNAL_STORAGE(state, val) {
  45. state.WRITE_EXTERNAL_STORAGE = val
  46. },
  47. SET_CALL_PHONE(state, val) {
  48. state.CALL_PHONE = val
  49. },
  50. SET_ACCESS_FINE_LOCATION(state, val) {
  51. state.ACCESS_FINE_LOCATION = val
  52. }
  53. },
  54. actions: {
  55. //权限获取
  56. async requestPermissions({state,dispatch,commit}, permissionID) {
  57. try {
  58. if (!state[permissionID] && !state.isIos) {
  59. var viewObj = await dispatch('nativeObjView', permissionID);
  60. viewObj.show();
  61. }
  62. console.log('android.permission.' + permissionID, '当前手机权限');
  63. return new Promise(async (resolve, reject) => {
  64. //苹果不需要这个
  65. if (state.isIos) {
  66. resolve(1);
  67. return
  68. }
  69. // Android权限查询
  70. function requestAndroidPermission(permissionID_) {
  71. return new Promise((resolve, reject) => {
  72. plus.android.requestPermissions(
  73. [permissionID_], // 理论上支持多个权限同时查询,但实际上本函数封装只处理了一个权限的情况。有需要的可自行扩展封装
  74. function(resultObj) {
  75. var result = 0;
  76. for (var i = 0; i < resultObj.granted.length; i++) {
  77. // var grantedPermission = resultObj.granted[i];
  78. // console.log('已获取的权限:' + grantedPermission);
  79. result = 1
  80. }
  81. for (var i = 0; i < resultObj.deniedPresent.length; i++) {
  82. // var deniedPresentPermission = resultObj.deniedPresent[i];
  83. // console.log('拒绝本次申请的权限:' + deniedPresentPermission);
  84. result = 0
  85. }
  86. for (var i = 0; i < resultObj.deniedAlways.length; i++) {
  87. // var deniedAlwaysPermission = resultObj.deniedAlways[i];
  88. // console.log('永久拒绝申请的权限:' + deniedAlwaysPermission);
  89. result = -1
  90. }
  91. resolve(result);
  92. },
  93. function(error) {
  94. console.log('申请权限错误:' + error.code + " = " + error
  95. .message);
  96. resolve({
  97. code: error.code,
  98. message: error.message
  99. });
  100. }
  101. );
  102. });
  103. }
  104. const result = await requestAndroidPermission(
  105. 'android.permission.' + permissionID
  106. );
  107. if (result === 1) {
  108. //'已获得授权'
  109. commit(state.mapping[permissionID].methods, true)
  110. } else if (result === 0) {
  111. //'未获得授权'
  112. commit(state.mapping[permissionID].methods, false)
  113. } else {
  114. commit(state.mapping[permissionID].methods, true)
  115. uni.showModal({
  116. title: '提示',
  117. content: '操作权限已被拒绝,请手动前往设置',
  118. confirmText: "立即设置",
  119. success: (res) => {
  120. if (res.confirm) {
  121. dispatch('gotoAppPermissionSetting')
  122. }
  123. }
  124. })
  125. }
  126. if (viewObj) viewObj.close()
  127. resolve(result);
  128. });
  129. } catch (error) {
  130. console.log(error);
  131. reject(error);
  132. }
  133. },
  134. //提示框
  135. nativeObjView({state}, permissionID) {
  136. const systemInfo = uni.getSystemInfoSync();
  137. const statusBarHeight = systemInfo.statusBarHeight;
  138. const navigationBarHeight = systemInfo.platform === 'android' ? 48 :
  139. 44; // Set the navigation bar height based on the platform
  140. const totalHeight = statusBarHeight + navigationBarHeight;
  141. let view = new plus.nativeObj.View('per-modal', {
  142. top: '0px',
  143. left: '0px',
  144. width: '100%',
  145. backgroundColor: '#444',
  146. //opacity: .5;
  147. })
  148. view.drawRect({
  149. color: '#fff',
  150. radius: '5px'
  151. }, {
  152. top: totalHeight + 'px',
  153. left: '5%',
  154. width: '90%',
  155. height: "100px",
  156. })
  157. view.drawText(state.mapping[permissionID].title, {
  158. top: totalHeight + 5 + 'px',
  159. left: "8%",
  160. height: "30px"
  161. }, {
  162. align: "left",
  163. color: "#000",
  164. }, {
  165. onClick: function(e) {
  166. console.log(e);
  167. }
  168. })
  169. view.drawText(state.mapping[permissionID].content, {
  170. top: totalHeight + 35 + 'px',
  171. height: "60px",
  172. left: "8%",
  173. width: "84%"
  174. }, {
  175. whiteSpace: 'normal',
  176. size: "14px",
  177. align: "left",
  178. color: "#656563"
  179. })
  180. function show() {
  181. view = plus.nativeObj.View.getViewById('per-modal');
  182. view.show()
  183. view = null //展示的时候也得清空,不然影响下次的关闭,不知道为啥
  184. }
  185. function close() {
  186. view = plus.nativeObj.View.getViewById('per-modal');
  187. view.close();
  188. view = null
  189. }
  190. return {
  191. show,
  192. close
  193. }
  194. },
  195. // 跳转到**应用**的权限页面
  196. gotoAppPermissionSetting({state}) {
  197. if (state.isIos) {
  198. var UIApplication = plus.ios.import("UIApplication");
  199. var application2 = UIApplication.sharedApplication();
  200. var NSURL2 = plus.ios.import("NSURL");
  201. // var setting2 = NSURL2.URLWithString("prefs:root=LOCATION_SERVICES");
  202. var setting2 = NSURL2.URLWithString("app-settings:");
  203. application2.openURL(setting2);
  204. plus.ios.deleteObject(setting2);
  205. plus.ios.deleteObject(NSURL2);
  206. plus.ios.deleteObject(application2);
  207. } else {
  208. // console.log(plus.device.vendor);
  209. var Intent = plus.android.importClass("android.content.Intent");
  210. var Settings = plus.android.importClass("android.provider.Settings");
  211. var Uri = plus.android.importClass("android.net.Uri");
  212. var mainActivity = plus.android.runtimeMainActivity();
  213. var intent = new Intent();
  214. intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
  215. var uri = Uri.fromParts("package", mainActivity.getPackageName(), null);
  216. intent.setData(uri);
  217. mainActivity.startActivity(intent);
  218. }
  219. }
  220. }
  221. })
  222. // 导出 store
  223. export default store

在页面中引用

  1. // demo click
  2. onclick() {
  3. /* #ifdef APP-PLUS */
  4. let result = await store.dispatch("requestPermissions",'WRITE_EXTERNAL_STORAGE')
  5. if (result !== 1) return
  6. /* #endif */
  7. // 下面的逻辑随便 怎么写
  8. return uni.showToast({
  9. title:'权限获取成功'
  10. })
  11. },

(最新更新时间:2023-12-13)

-解决了小伙伴不知道相机和相册权限怎么分开问题

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/36507
推荐阅读
相关标签
  

闽ICP备14008679号