uniapp热更新的实现
在进行版本迭代时一般是局部更新,所以热更新就是新的需求,HBuilderX 1.6.5 起,uni-app 支持生成 App 资源升级包。
热更新方案:
通过增加当前APP资源的版本号(versionCode),跟上一次打包时的APP资源版本号进行对比,如果比之前的资源版本号高,即进行热更新。
热更新原理:
uniapp的热更新,其实是将build后的APP资源,打包为一个zip压缩包(扩展名改为wgt)。
涉及到的版本信息文件:
- src/manifest.json(主要)
- app.json (自己创建,用于版本对比)
- platforms/android/app/build.gradle
注意事项:保证以上文件的versionName和versionCode均保持一致。
更新接口:
实际上,在这之前,我们还需要判断是否需要更新,这就涉及到接口的部分。在此,只讲讲思路:
- 获取安装的版本名、版本号等信息,将其当做参数调用对应的更新接口;
- 接口取到这些信息,与最新版本进行对比,如果版本已经更新,返回需要更新的信息;
- 接口可以自行约定,怎么方便这么来。
在uniapp中获取版本号代码:
getInfo(){
return new Promise((resolve, reject) => {
plus.runtime.getProperty(plus.runtime.appid,(info)=>{
resolve(info)
})
})
}
/*调用,在获取版本号请求服务器判断是否更新的时候*/
const toReq = async (url,prams) => {
let info=await getInfo()
console.log(info.version) //1.0.0
//....
}热更新代码实现:
在uni-app 中,我们是如何实现热更新的呢?封装代码如下:
updateApp(url){
if(!url){
return
}
uni.showModal({
title: '更新提示',
content: '有新的版本发布,需立即进行新版本下载?',
confirmText:'确定',
showCancel:false,
success: function (res) {
let dtask = plus.downloader.createDownload(url, {}, function(d, status){
if ( status == 200 ) {//下载完成
plus.runtime.install(plus.io.convertLocalFileSystemURL(d.filename),{},{},function(error){
uni.showToast({
title: '安装失败',
duration: 1500
});
})
} else {
uni.showToast({
title: '更新失败',
duration: 1500,
});
}
});
let showLoading = plus.nativeUI.showWaiting("正在下载");
dtask.addEventListener("statechanged", function(task, status){
if(!dtask){
return;
}
switch(task.state){
case 1:
console.log("正在下载");
break;
case 2:
console.log("已连接到服务器");
break;
case 3:
let updatePross = Math.floor(task.downloadedSize * 100 / task.totalSize);
uni.getNetworkType({
success: function (res) {
if(res.networkType=="none"){
uni.showToast({ title:'当前无网络连接', icon: "none"});
}
}
});
showLoading.setTitle(" 正在下载 " + updatePross + " % ");
break;
case 4:
plus.nativeUI.closeWaiting();
uni.hideLoading();
break;
}
});
dtask.setRequestHeader('Access-Control-Allow-Origin','*');
dtask.start();
}
});
}url为服务器端返回的热更新wgt包地址,当然返回apk也行(apk下载完成后会弹窗提示:是否安装程序)。
权限设置:
在AndroidManifest.xml中使用了如下的配置:
"<uses-permission android:name=\"android.permission.INSTALL_PACKAGES\"/>"
"<uses-permission android:name=\"android.permission.REQUEST_INSTALL_PACKAGES\"/>"需要注意的是:在部分应用市场是不支持热更新的,比如谷歌。
本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!