Android平台應用啟動時讀寫手機存儲、訪問設備信息(如IMEI)等權限策略及提示信息,解決uniapp上傳華為應用市場提示獲取手機存儲敏感權限,用戶不同意時強制退出應用的問題


一、問題背景

  最近將app上傳至華為應用市場時總是拒絕,其中有一條就是:我們發現您的應用提示獲取手機存儲敏感權限,用戶不同意時強制退出應用,請參考審核指南......, 修改建議:請在用戶不統一獲取手機存儲敏感權限時,應用不能自動退出或關閉。

未通過原因: 1、詳細描述:我們發現您應用的隱私政策未以明示同意的方式征得用戶同意。請參考《審核指南》第7.5相關審核要求:
https://developer.huawei.com/consumer/cn/doc/50104 ­測試步驟:登錄界面默認同意《用戶協議》和《隱私政策》。 ­修改建議:應用的隱私政策需以明示同意的方式征得用戶同意(如提供主動勾選按鈕或點擊“同意”按鈕)。 2、詳細描述:我們發現您的應用在用戶不同意獲取存儲敏感權限時,應用強制退出、無法登錄/注冊、無法進入。請參考《審核指南》第7.17相關審核要求:
https://developer.huawei.com/consumer/cn/doc/50104 ­測試步驟:啟動應用后,提示需獲取存儲等權限,拒絕后直接退出應用 ­修改建議:請在用戶不同意獲取存儲敏感權限時,應用不能自動退出或無法進入。 您可以 登錄 到華為應用市場管理中心進行下列操作: 1、您可以聯系客服,咨詢和反饋您的需求; 2、您可以修改並重新發布您的應用。

  就是說在應用市場安裝時,一般都會彈出授權,讓用戶允許授權訪問存儲權限。如果用戶禁止的話,不能退出應用,要仍然可以進入使用應用。

  其他應用市場都沒這個原因拒絕,只有華為有。所以查資料,網上的博文也是說啥的都有,有好多自己也踩坑了估計不自知。

1、第一篇:uni-app 上架華為 存儲問題駁回

  這篇說的是:在 manifest.json 文件中添加一句話,忽略提示存儲彈框問題。

"android" : {   // 避免華為上架問題
  "permissionExternalStorage" : {     "request" : "none",     "prompt" : "應用保存運行狀態等信息,需要獲取讀寫手機存儲(系統提示為訪問設備上的照片、媒體內容和文件)權限,請允許。"   },   // 此處內容省略
}

  注意他這個解決很危險,直接設為了“none”,也就是說完全不彈出授權。這樣的話,后期如果app里需要保持圖片或者上傳圖片的時候,因為沒有授權訪問設備的存儲權限,保存圖片時會保存不了,上傳圖片時選擇的也全都是空的,選不了。

2、第二篇:uniapp上傳華為應用市場,提示獲取手機存儲敏感權限,用戶不同意時強制退出應用

  uniapp雲打包后生成apk,第一次啟動會申請存儲權限,用戶點擊不同意會退出app,而且這個申請是uniapp基座包做的,和開發者寫的代碼無關,是uniapp基座運行起來就會申請這個權限。

  問題原因:uniapp支持增量更新,想要支持熱更新就需要存儲權限,但是wgt熱更新是應用市場不樂見的。

  解決方案:在manifest.json中打開源碼視圖,在‘distribute’下的“android”節點添加

// 應用發布信息
"distribute" : {   // android打包配置
  "android" : {     "permissionPhoneState" : {       "request" : "once",       "prompt" : "為保證您正常、安全地使用,需要獲取設備識別碼(部分手機提示為獲取手機號碼)使用權限,請允許。"     },     "permissionExternalStorage" : {       "request" : "once",       "prompt" : "應用保存運行狀態等信息,需要獲取讀寫手機存儲(系統提示為訪問設備上的照片、媒體內容和文件)權限,請允許。"     },     // 省略其他配置
  } }

  他這個設置是“once”,也就是第一次安裝時會彈出授權讓用戶選擇“允許”或“禁止”,但是這種情況就是用戶選擇“禁止”,應用不會退出,仍然可以進入自由訪問。但是就是會存在與上面一樣的問題。

  保存之后,雲打包生成apk,再次安裝啟動的時候還是會申請權限,但是拒絕后不會出現,強制退出應用。上傳華為應用市場,是可以通過的。

二、解決方案:Android平台應用啟動時讀寫手機存儲、訪問設備信息(如IMEI)等權限策略及提示信息

  Android平台從6.0(API23)開始系統對權限的管理更加嚴格,所有涉及敏感權限都需要用戶授權允許才能獲取。

  因此一些應用基礎業務邏輯需要的權限會在應用啟動時申請,並引導用戶允許。

1、讀寫手機存儲權限

HBuilderX3.0+版本調整申請讀寫手機存儲權限策略默認值為 once

  應用需要保存運行狀態等數據到手機SD卡中,啟動時需要獲取讀寫手機存儲權限,此權限為基礎權限,影響真機運行、wgt升級。

  • 注意:此權限目標不是要訪問相冊,是Android把相冊寫入權限和存儲寫入權限合並在一個權限里了。
  • 注意:wgt熱更新是應用市場不樂見的,不建議明顯提示給用戶或告知應用市場。

  申請讀寫手機存儲需要用戶授權,會彈出如下提示框:

  HBuilderX2.4.2及以下版本,用戶拒絕此權限則直接退出應用。

  HBuilderX2.4.3+版本,用戶拒絕后鍵會彈出以下提示框引導用戶重新允許

  點擊“取消”退出應用;

  點擊“確定”重新彈出授權框,如果用戶已經勾選“不再詢問”則打開應用的設置界面。

2、此提示語可在manifest.json中配置

  HBuilderX2.5.0+開始支持配置應用啟動時申請獲取手機存儲權限,支持以下三種策略

(1)none:應用啟動時不申請

(2)once:應用第一次啟動時申請,用戶可以拒絕

(3)always:應用每次啟動都申請,並且用戶必須允許,用戶拒絕時會彈出如上的提示框引導用戶重新允許

3、源碼視圖配置

  打開manifest.json文件,切換到“源碼視圖”項

(1)uni-app項目:在"app-plus" -> "distribute" -> "android" 節點下添加 permissionExternalStorage 節點

(2)5+ App項目:在 "plus" -> "distribute" -> "google" 節點下添加 permissionExternalStorage 節點

  permissionExternalStorage節點數據格式如下:

"permissionExternalStorage": {   "request": "always",   "prompt": "應用保存運行狀態等信息,需要獲取讀寫手機存儲(系統提示為訪問設備上的照片、媒體內容和文件)權限,請允許。" }

(2-1)request:字符串類型,必填,申請讀寫手機存儲權限策略,可取值none、once、always。

  HBuilderX3.0+版本默認值調整為once;HBuilderX3.0以下版本默認值always。

(2-2)prompt:字符串類型,可選,用戶拒絕時彈出提示框上的內容。

  默認值為:應用保存運行狀態等信息,需要獲取讀寫手機存儲(系統提示為訪問設備上的照片、媒體內容和文件)權限,請允許。

  國際化配置參考:https://ask.dcloud.net.cn/article/35860#strings

  設置自定義鍵名稱為“dcloud_permission_write_external_storage_message”。

  保存后提交雲端打包生效

4、訪問設備信息權限

  Android平台應用獲取設備信息(如IMEI、IMSI等),統計、推送、廣告等業務功能依賴這些信息。

  此權限不是必選,拒絕此權限不影響App端基座運行。但擁有本權限可以給開發者提供更准確的統計報表。而申請獲取這些信息需要用戶授權,會彈出如下提示框:

  華為手機應用的設置中權限列表中為“電話”權限

  HBuilderX2.3.8+開始支持配置應用啟動時申請獲取設備信息權限,支持以下三種策略

(1)none:應用啟動時不申請

(2)once:應用第一次啟動時申請,用戶可以拒絕

(3)always:應用每次啟動都申請,並且用戶必須允許,用戶拒絕時會彈出以下提示框引導用戶重新允許

  此提示框刪的文本可自定義,參考下面的prompt字段

  默認策略為once,即應用第一次啟動時申請

5、源碼視圖配置

  打開manifest.json文件,切換到“源碼視圖”項

(1)uni-app項目:在 "app-plus" -> "distribute" -> "android" 節點下添加 permissionPhoneState 節點

(2)5+ App項目:在 "plus" -> "distribute" -> "google" 節點下添加 permissionPhoneState 節點

  permissionPhoneState節點數據格式如下:

"permissionPhoneState": {   "request": "always",   "prompt": "為保證您正常、安全地使用,需要獲取設備識別碼(部分手機提示為獲取手機號碼)使用權限,請允許。" }

  request:字符串類型,必填,申請設備信息權限策略,可取值none、once、always。默認值為once。

  prompt:字符串類型,可選,用戶拒絕時彈出提示框上的內容。

  默認值為:為保證您正常、安全地使用,需要獲取設備識別碼(部分手機提示為獲取手機號碼)使用權限,請允許。

  國際化配置參考:https://ask.dcloud.net.cn/article/35860#strings

  設置自定義鍵名稱為“dcloud_permission_read_phone_state_message”。

  保存后提交雲端打包生效

三、離線打包提示語配置及彈窗配置。

1、提示語配置:

  在主項目的strings.xml中添加如下字段。strings.xml位於 項目目錄/src/main/res/values下,如果文件或文件夾不存在,直接新建即可。

(1)存儲權限提示語配置

<resources>  
    <string name="dcloud_permission_write_external_storage_message">存儲權限提示語</string>  
</resources>  

(2)讀取手機狀態權限配置

<resources>  
    <string name="dcloud_permission_read_phone_state_message">讀取手機狀態權限提示語</string>  
</resources>  

2、彈窗配置:

  在androidManifest.xml的application節點下添加如下字段。

(1)存儲權限彈窗配置

<application>  
  <meta-data android:name="DCLOUD_WRITE_EXTERNAL_STORAGE" android:value="once"/>  
</application>  

  value可取值為 none、once、always。

(2)讀取手機狀態彈窗配置

<application>  
  <meta-data android:name="DCLOUD_READ_PHONE_STATE" android:value="once"/>  
</application>  

  value可取值為 none、once、always。

 

  補充:部分開發者在main.js里面調用了plus.device.getInfo這類方法。但是其實API操作與permissionExternalStorage設置無關,permissionExternalStorage用於設置應用內部邏輯是否申請訪問SD卡權限。

  開發者是因為在啟動的時候調用API觸發了權限申請,誤以為permissionExternalStorage設置無效(其實設置是生效的)。

  其它API操作會根據功能需求來申請權限,比如操作系統相冊也會申請訪問SDK卡權限、定位操作會申請定位權限等。

四、App權限判斷和提示

  通過以上了解我們知道了,存儲權限為應用基本權限,只有華為應用市場才有這個限制,那么沒辦法,可以分開處理,在其他情況使用“always”,在華為打包時使用“once”,這樣可以解決大部分問題,但是還是會存在個別用戶拒絕存儲權限的話,后期在保存圖片和上傳圖片之類時會有問題,那么只能提示讓用戶開啟存儲權限了。

  Dcloud官方也提供了一個插件:App權限判斷和提示:https://ext.dcloud.net.cn/plugin?id=594

  里面有權限判斷和提示,但是那要加的地方確實太多了,有強制要求的就加吧,沒有的話,我覺得在幫助中心給用戶提個常見問題處理即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM