在进行版本迭代时一般是局部更新,所以热更新就是新的需求,HBuilderX 1.6.5 起,uni-app 支持生成 App 资源升级包。
热更新方案:
通过增加当前APP资源的版本号(versionCode),跟上一次打包时的APP资源版本号进行对比,如果比之前的资源版本号高,即进行热更新。
热更新原理:
uniapp的热更新,其实是将build后的APP资源,打包为一个zip压缩包(扩展名改为wgt)。
涉及到的版本信息文件:
注意事项:保证以上文件的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\"/>"
需要注意的是:在部分应用市场是不支持热更新的,比如谷歌。
uni.getUserInfo 接口调用方式起初通过button 来获取用户信息,或者 直接调用 uni.getUserInfo 来获取信息 在当前微信更新接口后,这2个接口将直接返回匿名用户数据,不在弹窗提示
发现了点击按钮1可以更新title内容,但是点击按钮2却无法更新title内容。这个究竟是为什么呢?在changeTitle2方法的success方法中,该success方法指向闭包,所以this属于闭包
首先介绍最原始的跳转方法,类似于html中的 a 标签,不过在uniapp中需要将 a 标签换成 <navigator url=跳转的地址>……</navigator>
static 目录下的 js 文件不会被编译,如果里面有 es6 的代码,不经过转换直接运行,在手机设备上会报错。css、less/scss 等资源同样不要放在 static 目录下
发送验证码时,不能让客户一直发送验证码,所以需要设置一个60s后才能发送一次;具体代码实现:因为app和其他app不太一样,所以需要选择以这样的方式展示是时间,但是js逻辑代码是一样的;
computed里面的属性不能在data属性中出现,用来监控computed中自定义的变量 ,computed合适多个变量或对象处理后返回一个结果值,其中一个值发生变化则computed监控的属性值就会发生变化
开发了一年的uni-app,在这里总结一些uni-app开发中的问题,提供几个解决方法,分享给大家:问题描述:一个主页面,需要联通一到两个子页面,子页面传值到主页面,主页面更新
当重复设置某些属性为相同的值时,不会同步到view层。 例如:每次将scroll-view组件的scroll-top属性值设置为0,只有第一次能顺利返回顶部。 这和props的单向数据流特性有关
uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/头条/QQ/钉钉/淘宝)、快应用等多个平台。
基于QR.createQrCodeImg方法生成二维码,在使用uniapp开发的小程序,app应用,某一页面需要将网页Url生成的二维码进行展示,即将Url生成为base64的二维码图片。
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!