热更新的好处就不说了,直接上干活(安卓为例)
1,我是用HBuilderX生成的uni-app项目,然后打包成apk。(HBuilderX版本是2.7.14)
2,热更新的思路
(1)项目中有当前版本号(currentVersionID),服务器端有接口提供最新版本号(newVersionID)
(2)每次进入应用,用当前版本号和最新版本号做对比,如果不一致,就进行更新
(3)下载wgt资源包,安装,重启
3,下边是上边三个步骤的实现
(1)main.js中定义一个全局的变量或常量
import Vue from 'vue' import App from './App' const currentVersion = { verson: 101 //代表当前项目的版本 } Vue.config.productionTip = false Vue.prototype.$current = currentVersion //挂载到抢钱vue示例的原型上,方便全局访问 App.mpType = 'app'
const app = new Vue({ ...App }) app.$mount()
(2)在App.vue的onLaunch方法中,进行版本的判断
onLaunch: function() { const me = this // #ifdef APP-PLUS //1,从main.js中拿到当前的版本号 let myVerson = me.$current.verson uni.request({ url: 'http://11.11.11.11:9999/lastLabor/external/getVersion', //仅为示例,并非真实接口地址。 method: 'GET', success: (res) => { let newVerson = Number(res.data.version) if (myVerson < newVerson) { //如果我的版本号小于当前版本号 plus.nativeUI.toast("下载wgt文件..."); me.downWgt() //下载wgt文件的方法 } else { console.log('不需要更新') } } }); // #endif }
(3)下载wgt资源包,安装,重启(methods中定义下载和安装方法)
methods:{ downWgt() { //下载安装包 const me = this; var wgtUrl="https://www.xxx.xxx/iwop/apk/__UNI__0D0B797.wgt"; //下载wgt安装包的地址 plus.downloader.createDownload( wgtUrl, {filename:"_doc/update/"}, function(d,status){ if ( status == 200 ) { //plus.nativeUI.toast("下载wgt成功:"+d.filename); plus.nativeUI.toast("下载wgt文件成功,安装中"); me.installWgt(d.filename); // 安装wgt包 } else { plus.nativeUI.toast("下载wgt失败!"); } plus.nativeUI.closeWaiting(); }).start(); }, installWgt(path) { //更新资源包 plus.runtime.install(path,{},function(){ plus.nativeUI.toast("应用资源更新完成!",function(){ plus.runtime.restart(); }); },function(e){ plus.nativeUI.toast("安装wgt文件失败["+e.code+"]:"+e.message); }); } }
生成wgt资源包,菜单 ==> 发行 ==> 原生App-制作应用wgt包
制作这个包的时候manifest.json的应用版本名称(例如1.0.1)和应用版本号(100),都要比正式当前的版本高