uniapp热更新的实现

摘要:在进行版本迭代时一般是局部更新,所以热更新就是新的需求,HBuilderX 1.6.5 起,uni-app 支持生成 App 资源升级包。过增加当前APP资源的版本号(versionCode),跟上一次打包时的APP资源版本号进行对比

在进行版本迭代时一般是局部更新,所以热更新就是新的需求,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均保持一致。


更新接口

实际上,在这之前,我们还需要判断是否需要更新,这就涉及到接口的部分。在此,只讲讲思路:

  1. 获取安装的版本名、版本号等信息,将其当做参数调用对应的更新接口;
  2. 接口取到这些信息,与最新版本进行对比,如果版本已经更新,返回需要更新的信息;
  3. 接口可以自行约定,怎么方便这么来。

在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\"/>"

需要注意的是:在部分应用市场是不支持热更新的,比如谷歌。


本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://shenqiku.cn/article/FLY_11049