uni-app版本更新(整包更新和wgt热更新)

时间:2021-7-21 作者:qvyue

整体流程:
1.uni-app打包成App,使用plus.runtime.getProperty方法获取本地应用资源版本号。
2.调用后端接口,拿到与后端规定好的版本号,与前面获取的版本号进行对比,如果不一致(也可以判断当前版本号是否小于线上版本号,也就是最新版本号),进行下一步操作。
3.uni.showModal弹出下载提示。
4.使用plus.downloader.createDownload下载安装包。下载完可以使用plus.runtime.openFile(path),打开文件安装。
5.另一种方法是去浏览器下载,使用plus.runtime.openURL(url); 打开一个网址去下载。
6.推荐的方法是使用wgt热更新,这样就不用每次更改都需要对ios包进行加签。这种方法着重记一下。

整包更新

uni-app版本更新(整包更新和wgt热更新)
image.png

HbuilderX App云打包,证书可以由公司安卓开发人员和ios开发人员提供,打安卓包也可以使用公共测试证书(不推荐,可测试用)。

uni-app版本更新(整包更新和wgt热更新)
image.png

打包完成会返回一个下载地址,在浏览器下载即可。将下载后的安卓包上传到公司的oss地址,以便之后供用户下载。为什么不放到服务器上?考虑到用户量比较大的情况,服务器可能承载不住。ios打包同安卓打包,多了一步需要加签,将.ipa文件和.plist文件都放到oss上,plist文件中引用ipa文件。

前端关键代码(APP.vue)

            // #ifdef APP-PLUS
            // 获取本地应用资源版本号
            plus.runtime.getProperty(plus.runtime.appid, (wgtinfo) => {
                this.$common.set('version', wgtinfo.version);
                this.$common.set('versionCode', wgtinfo.versionCode);
                
                // getcfg() 封装的接口方法; data.data.data.tips 提示信息;data.data.data.h5 下载地址
                getcfg().then(data => {
                    if(data.data.code == 1){
                        // console.log(data.data, "版本号");
                        if(data.data.data.v !== String(wgtinfo.versionCode)){
                            uni.showModal({ //提醒用户更新
                                title: "更新提示",  
                                content: data.data.data.tips,  
                                success: (res) => {  
                                    if (res.confirm) { // 跳转到下载页
                                        plus.runtime.openURL(data.data.data.h5);  
                                    }  
                                }  
                            }) 
                        } 
                    }
                })
            })
            // #endif

wgt热更新

发行,制作应用wgt包,将wgt包放到oss,后台返回wgt地址。
存在问题:使用wgt文件升级问题,安装wgt文件失败[-1205],WGT安装包中mainfest.json文件的version版本不匹配。
解决方法1,把线上的version版本号的首个数字调高;

解决方法2,在安装WGT的时候,添加一个参数,不进行版本对比。force: true

详见:文档地址
App.vue

            // #ifdef APP-PLUS
            // 获取本地应用资源版本号
            plus.runtime.getProperty(plus.runtime.appid, (wgtinfo) => {
                this.$common.set('version', wgtinfo.version);
                this.$common.set('versionCode', wgtinfo.versionCode);
                
                getcfg().then(data => {
                    if(data.data.code == 1){
                        if(data.data.data.v !== String(wgtinfo.versionCode)){
                            const dtask = plus.downloader.createDownload(data.data.data.wgturl, {force: true}, function ( d, status ) {    
                                if ( status == 200 ) { // 下载成功    
                                    var path = (d.filename);    
                                    plus.runtime.install(path,{},function(){
                                       plus.nativeUI.closeWaiting();
                                       console.log("安装wgt文件成功!");
                                       plus.nativeUI.alert("应用资源更新完成!",function(){
                                           plus.runtime.restart();
                                       });
                                   },function(e){
                                       plus.nativeUI.closeWaiting();
                                       console.log("安装wgt文件失败["+e.code+"]:"+e.message);
                                       plus.nativeUI.alert("安装wgt文件失败["+e.code+"]:"+e.message);
                                   });
                                } else {//下载失败    
                                    alert( "Download failed: " + status );     
                                }      
                            });    
                            uni.showModal({  
                                title:'版本更新',  
                                content: data.data.data.tips,  
                                confirmText:'下载',  
                                success: (res) => {  
                                    if(res.confirm) {  
                                        dtask.start();   
                                        let prg = 0;  
                                        let showLoading = plus.nativeUI.showWaiting("正在下载");  
                                        dtask.addEventListener('statechanged', function(task, status) {  
                                            // 给下载任务设置一个监听 并根据状态  做操作  
                                            switch (task.state) {  
                                                case 1:  
                                                  showLoading.setTitle("正在下载");  
                                                  break;  
                                                case 3:  
                                                  prg = parseInt((parseFloat(task.downloadedSize) / parseFloat(task.totalSize)) * 100);  
                                                  showLoading.setTitle("  正在下载" + prg + "%  ");  
                                                  break;  
                                                case 4:  
                                                   plus.nativeUI.closeWaiting();  
                                                    //下载完成  
                                                  break;  
                                            }  
                                        })  
                                    }  
                                }  
                            })
                        } 
                    }
                })
            })
            // #endif
声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。