cordova Android 端App版本更新

mac2025-03-25  11

App的更新思路:

如果只更新html5的部分,使用热更新也是无痕更新,好处:如果在ios端还可以绕过审核,不会有任何提示(热更新暂时没有实现,也就不瞎分享了)如果更新了插件,那就只能更新apk了: - 第一种:就是到各个手机的应用市场注册审核,然后有更新了就弹出框提示跳转到应用市场去更新 - 第二种:自己的一个服务器,检查服务器版本和本地版本之后,下载服务器中最新的apk,完成更新自动安装

目前项目中用的是第二种方式,简单记录一下整个更新的过程。

1, 安装插件:

cordova plugin add cordova-plugin-app-version cordova plugin add cordova-plugin-file-transfer cordova plugin add cordova-plugin-file-opener2

2,获取app的版本号和服务器的版本号:

获取app的versionCode

window.cordova.getAppVersion.getVersionCode(function (versionCode) { // Toast(versionCode); resolve(versionCode); });

cordova-plugin-app-version还有其他几个方法:

- (void)getAppName:(CDVInvokedUrlCommand*)command; - (void)getPackageName:(CDVInvokedUrlCommand*)command; - (void)getVersionNumber:(CDVInvokedUrlCommand*)command; - (void)getVersionCode:(CDVInvokedUrlCommand*)command;

使用方法,类似getVersionCode

获取服务器的versionCode:

api.getLastVersion().then(res => { const data = (res.data && res.data.data) || {}; this.versionCode = data.versionCode || 0; this.versionName = data.versionName || ''; this.defaultUrl = data.defaultUrl || ''; // Toast(`${this.versionCode}, ${this.defaultUrl}`); _this.checkUpdate(); });

对比校验

checkUpdate() { this.$bridge.getLastVersionCode().then(data => { if (this.versionCode > data) { this.$dialog.confirm({ title: '版本更新', message: `当前最新版本为:${this.versionName},请更新!` }).then(() => { this.$toast('下载应用中,请耐心等待!'); //下载并打开apk this.$bridge.downLoadApk(this.defaultUrl).then(result => { //console.debug('success' + result); }).catch(err => { this.$toast('下载失败,请检查网络是否畅通!'); // console.debug(err + 'err=========='); }); // const downLoadDom = this.$refs.downLoad; // downLoadDom.setAttribute('ref', this.defaultUrl); // downLoadDom.click(); }).catch(cancel => { // console.debug('取消更新' + cancel); }); } }); },

2,下载应用:

downLoadApk(url) { return ready((resolve, reject) => { //事件监听deviceready的回调 if (isApp) { //是否app const _this = this; const FileTransfer = window.FileTransfer; const fileTransfer = new FileTransfer(); // const uri = encodeURI('https://obs-xa001.obs.cn-north-1.myhuaweicloud.com/xiongan-app/xacx.apk'); const fileURL = 'cdvfile://localhost/temporary/tuner.apk';//经过测试这个地址没有问题,可以下载和安装 const targetPath = window.cordova.file.externalDataDirectory + 'xionganchuxing.apk';//这个地址也可以下载和安装 fileTransfer.download( encodeURI(url), //服务器地址 targetPath, //本地存储地址 function (entry) { //下载完成回调 Toast('应用下载完成!'); //console.debug('download complete: ' + JSON.stringify(entry) ); _this.openApk(targetPath, resolve, reject); // resolve(entry); }, function (error) { //下载失败回调 // console.debug('download error: ' + JSON.stringify(error)); reject(error); }, false, {} ); } }); }

3,打开app

//打开Apk openApk(targetUrl, resolve, reject) { if (isApp) { //console.debug('开始打开apk!' + targetUrl + 'fileOpen2' + window.cordova.plugins.fileOpener2); try { window.cordova.plugins.fileOpener2.open( targetUrl, 'application/vnd.android.package-archive', //打开apk function onSuccess(data) { console.debug('打开Apk成功' + targetUrl + 'data:' + data); resolve(data); }, function onError(error) { reject(error); // console.debug('出错!请在' + targetUrl + '目录下查看, error' + error); } ); } catch (e) { reject(e); console.debug('openApkError' + e); } } }

Ps:里面的ready, isApp,console.debug都是项目中已经封装的函数,主要还是思路。

最新回复(0)