? ? ? ? ?背景:APP用到的相關(guān)插件,cordova-plugin-bdasr人臉注冊和識別、cordova-amap-location獲取經(jīng)緯度坐標(biāo)及地理位置描述、cordova-plugin-android-permissions應(yīng)用權(quán)限獲取及授權(quán)。
? ? ?一、 簽名問題
? ? ? apk文件只有簽名后才能安裝使用,簽名的作用一方面保證安裝包內(nèi)文件的完整性,以防文件被篡改導(dǎo)致不可預(yù)知的后果;另一方面在安裝包內(nèi)附加應(yīng)用的開發(fā)者信息。
? ? ? ?apk簽名一般按照如下流程即可:【相關(guān)詳細(xì)信息參見“創(chuàng)建app數(shù)字簽名證書”】
? ? ?1)創(chuàng)建形成數(shù)字簽名證書文件,如該文件名為:thiskey.jks
? ? ? 2)編譯完成形成未簽名的apk文件,如文件名為:abc-unsigned.apk
? ? ? ?3)對apk文件進(jìn)行簽名,如形成簽名文件名為:abc.apk
? ? ?簽名命令:jarsigner -verbose -keystore thiskey.jks -signedjar abc.apk? -digestalg SHA1 -sigalg MD5withRSA abc-unsigned.apk nankailog
? ? ? 二、 授權(quán)問題
? ? ?apk需要授予“存儲”、“位置信息”、“相機”權(quán)限,否則無法進(jìn)行臉部識別或者無法獲取地理位置定位信息,以及由此導(dǎo)致的各類錯誤,最終就是相關(guān)應(yīng)用功能無法正常執(zhí)行。
? ? ?雖然可以在移動終端的“設(shè)置”功能中手工給應(yīng)用進(jìn)行授權(quán),但如果apk安裝包的config.xml沒有進(jìn)行正確設(shè)置,會導(dǎo)致無法執(zhí)行正確的手工授權(quán),甚至無法進(jìn)行授權(quán)(即找不到需要的權(quán)限進(jìn)行設(shè)置);或者即使config.xml正確設(shè)置了,手工授權(quán)時也需要操作人員具有一定的專業(yè)知識,否則手工操作授權(quán)的過程也會降低應(yīng)用使用的友好體驗。
? ? 因此為了方便授權(quán),提高操作的友好性:
? ?1)安裝安卓運行時權(quán)限檢測插件
…\ src-cordova> cordova plugin add cordova-plugin-android-permissions
? ? 2)代碼中增加權(quán)限校驗,和賦權(quán)功能
let permissions = cordova.plugins.permissions;
let p_list = [permissions.CAMERA,
permissions.INTERNET,
permissions.WRITE_EXTERNAL_STORAGE, permissions.ACCESS_NETWORK_STATE,
permissions.ACCESS_WIFI_STATE,
permissions.CHANGE_WIFI_STATE,
permissions.READ_PHONE_STATE,
permissions.ACCESS_COARSE_LOCATION, permissions.ACCESS_FINE_LOCATION ];
permissions.hasPermission(p_list, (status) => {
? ? ? if (!status.hasPermission) {
? ? ? ? ? permissions.requestPermissions(p_list, (status) => {
? ? ? ? ? ? ? if (!status.hasPermission) { this.$q.notify("請手工打開定位權(quán)限!"); }
? ? ? ? ? ? ? ?else { //this.$q.notify("已授權(quán)!"); }; }, () => { this.$q.notify("授予權(quán)限失敗!"); }); } else { //this.$q.notify("有權(quán)限!"); }; }, () => { this.$q.notify("訪問權(quán)限失敗!"); });
? ? 3)cordova的config.xml的“<platform name="android">”段內(nèi)增加如下配置信息
<config-file parent="/*" target="AndroidManifest.xml">
?<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
?<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
?<uses-permission android:name="android.permission.CAMERA" />
?<uses-permission android:name="android.permission.INTERNET" />
?<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
?<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
?<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> </config-file>
? ? 4)簽名的apk安裝完成后,第一次執(zhí)行會提示打開諸多權(quán)限,同時打開即可。如果不同意,那就只能手工到移動終端的“設(shè)置”功能中手工給應(yīng)用進(jìn)行授權(quán):“存儲”、“位置信息”、“相機”權(quán)限。
? ? 常見問題:
? ? ?1)config.xml中需要授予權(quán)限的確定依據(jù)
? ? ?到應(yīng)用用到的每個plugin中的plugin.xml文件中“uses-permission”查找所涉及的權(quán)限,然后匯總填寫到config.xml中。
? ? ? 2)無法掃臉識別、無法獲取定位信息時,手工到“設(shè)置”功能中手工給應(yīng)用進(jìn)行授權(quán):“存儲”、“位置信息”、“相機”權(quán)限。
? ? ?3)如果不配置以上參數(shù),則系統(tǒng)采用默認(rèn)參數(shù),由此可能導(dǎo)致諸多不可控權(quán)限錯誤。(如果運氣好,也可能一切都能正常運行)
? ? ?三、app圖標(biāo)
cordova的config.xml的“<platform name="android">”段內(nèi)增加如下配置信息:
<icon density="ldpi" src="res/icon/android/icon-36-ldpi.png" />
<icon density="mdpi" src="res/icon/android/icon-48-mdpi.png" />
<icon density="hdpi" src="res/icon/android/icon-72-hdpi.png" />
<icon density="xhdpi" src="res/icon/android/icon-96-xhdpi.png" />
? ? ? 當(dāng)然前提是在以上路徑res/icon/android/中增加所需要的圖標(biāo)文件。
? ? ?如果不配置以上信息,則采用默認(rèn)的安卓圖標(biāo)。
? ? ?四、跨域訪問
? ? ?cordova-plugin-bdasr人臉識別插件需要訪問百度開放的API,在開發(fā)環(huán)境下需要通過開發(fā)環(huán)境中的反向代理功能進(jìn)行API訪問:
url: '/baiduapi/rest/2.0/face/v3/search?' + qs.stringify(param3),
? ? 在發(fā)布版本中,由于APP是直接訪問,所以無需反向代理,直接訪問API:
url: 'https://aip.baidubce.com/rest/2.0/face/v3/search?' + qs.stringify(param3),
? ? 常見問題:需要搞清楚開發(fā)環(huán)境、web發(fā)布版本、APP版本的差異性,前兩者都需要進(jìn)行反向代理,當(dāng)然開發(fā)環(huán)境的反向代理是開發(fā)環(huán)境內(nèi)進(jìn)行配置支持,WEB發(fā)布版本一般需要在服務(wù)器端部署nginx以支持反向代理,app則不需要反向代理,直接訪問即可。