热更新的好处就不说了,直接上干活(安卓为例)
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),都要比正式当前的版本高