背景:APP用到的相关插件,cordova-plugin-bdasr人脸注册和识别、cordova-amap-location获取经纬度坐标及地理位置描述、cordova-plugin-android-permissions应用权限获取及授权。
一、 签名问题
apk文件只有签名后才能安装使用,签名的作用一方面保证安装包内文件的完整性,以防文件被篡改导致不可预知的后果;另一方面在安装包内附加应用的开发者信息。
apk签名一般按照如下流程即可:【相关详细信息参见“创建app数字签名证书”】
1)创建形成数字签名证书文件,如该文件名为:thiskey.jks
2)编译完成形成未签名的apk文件,如文件名为:abc-unsigned.apk
3)对apk文件进行签名,如形成签名文件名为:abc.apk
签名命令:jarsigner -verbose -keystore thiskey.jks -signedjar abc.apk -digestalg SHA1 -sigalg MD5withRSA abc-unsigned.apk nankailog
二、 授权问题
apk需要授予“存储”、“位置信息”、“相机”权限,否则无法进行脸部识别或者无法获取地理位置定位信息,以及由此导致的各类错误,最终就是相关应用功能无法正常执行。
虽然可以在移动终端的“设置”功能中手工给应用进行授权,但如果apk安装包的config.xml没有进行正确设置,会导致无法执行正确的手工授权,甚至无法进行授权(即找不到需要的权限进行设置);或者即使config.xml正确设置了,手工授权时也需要操作人员具有一定的专业知识,否则手工操作授权的过程也会降低应用使用的友好体验。
因此为了方便授权,提高操作的友好性:
1)安装安卓运行时权限检测插件
…\ src-cordova> cordova plugin add cordova-plugin-android-permissions
2)代码中增加权限校验,和赋权功能
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("请手工打开定位权限!"); }
else { //this.$q.notify("已授权!"); }; }, () => { this.$q.notify("授予权限失败!"); }); } else { //this.$q.notify("有权限!"); }; }, () => { this.$q.notify("访问权限失败!"); });
3)cordova的config.xml的“<platform name="android">”段内增加如下配置信息
<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安装完成后,第一次执行会提示打开诸多权限,同时打开即可。如果不同意,那就只能手工到移动终端的“设置”功能中手工给应用进行授权:“存储”、“位置信息”、“相机”权限。
常见问题:
1)config.xml中需要授予权限的确定依据
到应用用到的每个plugin中的plugin.xml文件中“uses-permission”查找所涉及的权限,然后汇总填写到config.xml中。
2)无法扫脸识别、无法获取定位信息时,手工到“设置”功能中手工给应用进行授权:“存储”、“位置信息”、“相机”权限。
3)如果不配置以上参数,则系统采用默认参数,由此可能导致诸多不可控权限错误。(如果运气好,也可能一切都能正常运行)
三、app图标
cordova的config.xml的“<platform name="android">”段内增加如下配置信息:
<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" />
当然前提是在以上路径res/icon/android/中增加所需要的图标文件。
如果不配置以上信息,则采用默认的安卓图标。
四、跨域访问
cordova-plugin-bdasr人脸识别插件需要访问百度开放的API,在开发环境下需要通过开发环境中的反向代理功能进行API访问:
url: '/baiduapi/rest/2.0/face/v3/search?' + qs.stringify(param3),
在发布版本中,由于APP是直接访问,所以无需反向代理,直接访问API:
url: 'https://aip.baidubce.com/rest/2.0/face/v3/search?' + qs.stringify(param3),
常见问题:需要搞清楚开发环境、web发布版本、APP版本的差异性,前两者都需要进行反向代理,当然开发环境的反向代理是开发环境内进行配置支持,WEB发布版本一般需要在服务器端部署nginx以支持反向代理,app则不需要反向代理,直接访问即可。
网友评论