uniapp热更新的实现

更新日期: 2022-01-19 阅读: 2.5k 标签: 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均保持一致。


更新接口

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

  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://fly63.com/article/detial/11049

相关推荐

uni-app关于iOS安全区解决方案

在uniapp开发中,我们可能会遇到一个问题,就是在iOS设备上底部会有一个安全区域,导致页面无法完全显示。因为iphoneX等机型最下面会有条黑色等线,导致按钮等元素被遮住部分,所以设置安全区边距会往上提

uni-app怎样设置横屏?

在使用uni-app开发app应用时候,应用需要横屏显示,那么该如何实现呢?打开pages.json页面,在globalStyle中添加pageOrientation选项

uni-app 微信小程序授权登录

uni.getUserInfo 接口调用方式起初通过button 来获取用户信息,或者 直接调用 uni.getUserInfo 来获取信息 在当前微信更新接口后,这2个接口将直接返回匿名用户数据,不在弹窗提示

uni-app中使用computed计算属性

computed里面的属性不能在data属性中出现,用来监控computed中自定义的变量 ,computed合适多个变量或对象处理后返回一个结果值,其中一个值发生变化则computed监控的属性值就会发生变化

uniapp如何打64位的安装包?

目前安卓在上架一些平台会要求64位,否则导致提交审核不成功,比如提示:请提供64位版本软件包后再提交审核。同时在一些骁龙8Gen3的手机上,也不在兼容32位的应用和游戏了

uniapp如何开启短震动_触感反馈实现

使用 uni-app 开发一款 app,需求中有一项是点击 触感反馈,查阅了 uni-app 相关文档,发现并没有对应的 API,最开始尝试用 震动 的方式来模拟 触感反馈 , 但是感觉效果并不好

uniapp开发注意事项

static 目录下的 js 文件不会被编译,如果里面有 es6 的代码,不经过转换直接运行,在手机设备上会报错。css、less/scss 等资源同样不要放在 static 目录下

uniapp之this作用域

发现了点击按钮1可以更新title内容,但是点击按钮2却无法更新title内容。这个究竟是为什么呢?在changeTitle2方法的success方法中,该success方法指向闭包,所以this属于闭包

uni-app实现苹果内购支付功能

首先我们需要勾选苹果支付,在manifest.json中,选择App模块配置->Payment(支付)。然后打包需要选择打基座包来测试。

uniapp验证码倒计时60s的实现

发送验证码时,不能让客户一直发送验证码,所以需要设置一个60s后才能发送一次;具体代码实现:因为app和其他app不太一样,所以需要选择以这样的方式展示是时间,但是js逻辑代码是一样的;

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!