美文网首页uin-app简明uniapp教程
版本升级功能(整包升级和差量升级)

版本升级功能(整包升级和差量升级)

作者: 瑟闻风倾 | 来源:发表于2019-12-06 08:50 被阅读0次

注意:HbuilderX升级后,此时应用升级时必须先进行整包升级,不能直接进行差量升级(热更新),原因参考:uni-app运行环境版本和编译器版本不一致的问题

(1) 版本号为三位:第一位用于更新大版本(apk),后两位用于差量小版本更新(wgt)

  • 后台逻辑:在text配置文件中配置version、wgtUrl 和pkgUrl这三个字段,version需同.wgt和.apk中版本较大的版本号保持一致
{
  "data": {
    "code": "0",
    "msg": "success",
    "data": {
      "version": "35.1.2",
      "wgtUrl": "http://***.***.com.cn/upload/appapk/gongzuotai35_1_2.wgt",
      "pkgUrl": "http://***.***.com.cn/upload/appapk/gongzuotai35.apk"
    }
  },
  "statusCode": 200,
  "header": {
    "Transfer-Encoding": "chunked",
    "Server": "nginx/1.16.1",
    "Access-Control-Allow-Origin": "*",
    "Connection": "keep-alive",
    "Pragma": "no-cache",
    "X-Android-Received-Millis": "1590544536402",
    "Access-Control-Allow-Headers": "x-requested-with, content-type",
    "Date": "Wed, 27 May 2020 01:55:36 GMT",
    "X-Android-Selected-Protocol": "http/1.1",
    "Cache-Control": "no-store, no-cache, must-revalidate",
    "X-Android-Response-Source": "NETWORK 200",
    "Expires": "Thu, 19 Nov 1981 08:52:00 GMT",
    "X-Android-Sent-Millis": "1590544536386",
    "_": "HTTP/1.1 200 OK",
    "Content-Type": "application/json;charset=utf-8",
    "X-Powered-By": "PHP/7.1.33"
  },
  "errMsg": "request:ok"
}
  • 移动端在App.vue文件中处理版本更新逻辑:比较当前版本current和服务器返回的version字段,若(当前版本第一位 < 服务器版本第一位),则进行apk整包升级;若(当前版本第一位 = 服务器版本第一位 但 当前版本第二位< 服务器版本第二位),或者 (当前版本第一位 = 服务器版本第一位 且 当前版本第二位 = 服务器版本第二位,但 当前版本第三位< 服务器版本第三位),则进行wgt差量升级。
<script>
    var _self;
    export default {
        methods:{
            downloadAndHandleWgtFile:function(url){
                uni.downloadFile({
                    url: url,  
                    success: (downloadResult) => {  
                        console.log("downLoadFile:" + JSON.stringify(downloadResult));
                        if (downloadResult.statusCode === 200) {  
                            plus.runtime.install(downloadResult.tempFilePath, {  
                                force: false  
                            }, function() {  
                                console.log('install success...');  
                                plus.runtime.restart();  
                            }, function(e) {  
                                console.error('install fail...');  
                            });  
                        }  
                    }  
                });  
            },
            downloadAndHandleApkFile:function(url){     
                plus.nativeUI.showWaiting("下载中..."); 
                var dtask = plus.downloader.createDownload( url, {}, function ( d, status ) {  
                    if ( status == 200 ) { // 下载成功  
                        var path = d.filename;  
                        console.log("path:" + d.filename);  
                        plus.runtime.install(path);  // 安装下载的apk文件  
                    } else {//下载失败  
                        alert( "Download failed: " + status );   
                    }   
                    plus.nativeUI.closeWaiting(); 
                });  
                dtask.start();
            }
        },
        onLaunch: function() {
            _self = this;
            console.log('App Launch');
            // #ifdef APP-PLUS
            // 锁定屏幕方向
            // plus.screen.lockOrientation('portrait-primary'); //锁定
            plus.screen.lockOrientation("landscape");//根据重力方向横屏显示
            // plus.navigator.setFullscreen(true);//应用全屏(只能隐藏状态栏,标题栏和虚拟返回键都还可以显示)
            
            // 检测升级
            plus.runtime.getProperty(plus.runtime.appid, function(widgetInfo) {  
                console.log("version:" + widgetInfo.version + ",name:" + widgetInfo.name);
                var requestUrl = "http://" + _self.getIP() + "/";
                uni.request({  
                    url: requestUrl + 'index/update',  
                    success: (res) => {  
                        console.log('update success', JSON.stringify(res));
                        var res = res.data; 
                        var pkgUrl = res.data.pkgUrl;
                        var wgtUrl = res.data.wgtUrl;
                        var currentVersions = widgetInfo.version.split('.');
                        var resultVersions = res.data.version.split('.'); 
                        if(currentVersions[0] - resultVersions[0] > 0){
                            console.log("当前版本超过服务器版本_0,为测试版");
                            return;
                        }else if(currentVersions[0] - resultVersions[0] < 0){//更新大版本
                            console.log("更新大版本");
                            uni.showModal({
                                title: '发现新版本',
                                content: '是否下载更新?',
                                success: function (res) {
                                    if (res.confirm) {
                                        console.log('用户点击确定');
                                        _self.downloadAndHandleApkFile(pkgUrl);
                                    } else if (res.cancel) {
                                        console.log('用户点击取消');
                                    }
                                }
                            });
                        }else {
                            if(currentVersions[1] - resultVersions[1] > 0){
                                console.log("当前版本超过服务器版本_1,为测试版");
                                return;
                            }else if(currentVersions[1] - resultVersions[1] < 0){//更新小版本
                                console.log("更新小版本");
                                _self.downloadAndHandleWgtFile(wgtUrl);
                            }else{
                                if(currentVersions[2] - resultVersions[2] > 0){
                                    console.log("当前版本超过服务器版本_2,为测试版");
                                    return;
                                }else if(currentVersions[2] - resultVersions[2] < 0){//更新小版本
                                    console.log("更新小版本");
                                    _self.downloadAndHandleWgtFile(wgtUrl);
                                }else{
                                    console.log("相同版本,无需更新");
                                }
                            }
                        }

                    /* var sub0 = currentVersions[0] - resultVersions[0];
                    var sub1 = currentVersions[1] - resultVersions[1];
                    var sub2 = currentVersions[2] - resultVersions[2];
                    console.log("版本更新:" + sub0 + "," + sub1 + "," + sub2);
                    if(sub0 < 0 ){//更新大版本
                        console.log("更新大版本");
                        uni.showModal({
                            title: '发现新版本',
                            content: '是否下载更新?',
                            success: function (res) {
                                if (res.confirm) {
                                    console.log('用户点击确定');
                                    _self.downloadAndHandleApkFile(pkgUrl);
                                } else if (res.cancel) {
                                    console.log('用户点击取消');
                                }
                            }
                        });
                        return;
                    }
                    if((sub0 == 0 && sub1 < 0) || (sub0 == 0 && sub1 == 0 && sub2 < 0)){//更新小版本(后两位)
                        console.log("更新小版本");
                        _self.downloadAndHandleWgtFile(wgtUrl);
                    } */

                         
                    }  
                });  
            });  
            // #endif
        },
        onShow: function() {
            console.log('App Show')
        },
        onHide: function() {
            console.log('App Hide')
        },
        // 捕获 app error
        onError:function(err) {
            console.log('App Error' + err);
        }
    }
</script>

<style>
    
</style>

(2) 版本号为三位(大版本.改需求.修bug):前两位用于更新大版本(apk),第三位用于差量小版本更新(wgt)

  • 前端操作:可上传apk和wgt文件,并选择类型为线上版本(当前稳定版本)、开发版本(最新测试版本)和老版本(上一版稳定版本)

  • 后台逻辑:比较线上版本的apk和wgt文件的版本号,若前两位不同则取apk的版本号作为version字段的值返回给移动端;前两位相同则取wgt的版本号作为version字段的值返回给移动端。

  • 移动端在App.vue文件中处理版本更新逻辑:比较当前版本current和服务器返回的version字段,若(当前版本第一位 < 服务器版本第一位 )或 (当前版本第一位 = 服务器版本第一位 但 当前版本第二位< 服务器版本第二位),则进行apk整包升级;若(当前版本第一位 = 服务器版本第一位 且 当前版本第二位 = 服务器版本第二位,但 当前版本第三位< 服务器版本第三位),则进行wgt差量升级。

/* if(currentVersions[0] - resultVersions[0] > 0){
    console.log("当前版本超过服务器版本_0,为测试版");
    return;
}else if(currentVersions[0] - resultVersions[0] < 0){//更新大版本
    console.log("更新大版本");
    uni.showModal({
        title: '发现新版本',
        content: '是否下载更新?',
        success: function (res) {
             if (res.confirm) {
                console.log('用户点击确定');
                _self.downloadAndHandleApkFile(pkgUrl);
            } else if (res.cancel) {
                console.log('用户点击取消');
            }
        }
    });
}else {
    if(currentVersions[1] - resultVersions[1] > 0){
        console.log("当前版本超过服务器版本_1,为测试版");
        return;
    }else if(currentVersions[1] - resultVersions[1] < 0){//更新大版本
        console.log("更新大版本");
        uni.showModal({
             title: '发现新版本',
            content: '是否下载更新?',
            success: function (res) {
                if (res.confirm) {
                    console.log('用户点击确定');
                     _self.downloadAndHandleApkFile(pkgUrl);
                 } else if (res.cancel) {
                    console.log('用户点击取消');
                }
            }
        });
    }else{
        if(currentVersions[2] - resultVersions[2] > 0){
            console.log("当前版本超过服务器版本_2,为测试版");
            return;
        }else if(currentVersions[2] - resultVersions[2] < 0){//更新小版本
            console.log("更新小版本");
            _self.downloadAndHandleWgtFile(wgtUrl);
        }else{
            console.log("相同版本,无需更新");
        }
    }
} */

var sub0 = currentVersions[0] - resultVersions[0];
var sub1 = currentVersions[1] - resultVersions[1];
var sub2 = currentVersions[2] - resultVersions[2];
console.log("版本更新:" + sub0 + "," + sub1 + "," + sub2);
if(sub0 < 0 || (sub0 == 0 && sub1 < 0)){//更新大版本(前两位)
    console.log("更新大版本");
    uni.showModal({
        title: '发现新版本',
        content: '是否下载更新?',
        success: function (res) {
            if (res.confirm) {
                console.log('用户点击确定');
                _self.downloadAndHandleApkFile(pkgUrl);
            } else if (res.cancel) {
                console.log('用户点击取消');
            }
        }
    });
    return;
}
if(sub0 == 0 && sub1 == 0 && sub2 < 0){//更新小版本(第三位)
    console.log("更新小版本");
    _self.downloadAndHandleWgtFile(wgtUrl);
}

相关文章

  • 版本升级功能(整包升级和差量升级)

    App.vue

  • UNI-APP 资源在线升级/热更新

    官方已发布APP升级中心,支持原生APP整包升级和wgt资源包升级。详见 https://uniapp.dclou...

  • yum update 和 yum upgrade的区别

    yum -y update 升级所有包,改变软件设置和系统设置,系统版本内核都升级 yum -y upgrade ...

  • iOS 蓝牙固件升级

    升级介绍 蓝牙固件升级是使用手机给固件进行版本升级,以达到修复bug或者添加新功能的作用。升级的大概流程是:首先,...

  • logback maxHistory 无效?试试这个吧

    totalSizeCap 无效 升级logbackjar包到1.1.8版本,最好升级到1.2.0版本,因为1.2....

  • 版本升级

    1.spring框架版本升级 会报错: 原因是:spring和jackson相关版本不兼容 2.其他工具包升级 3...

  • Anaconda

    升级,初次下载后conda版本较低,建议升级 conda upgrade --all 下载包,可指定多个包及各自版...

  • 数据库架构

    数据库升级,升级信息来源:xml、json之类都可以。升级之后会应用为bean没有升级而某些功能不能使用。跨版本,...

  • uniapp端更新升级

    App端更新升级 app升级分为两种:整包/资源热更新 整包更新,即常规的整个App安装包重新下载安装。 资源热更...

  • 联通客户端5.7版本 升级送流量

    随着客户端活动的不断增添和升级,目前联通客户端已经升级到5.7版本,此次升级除了功能上的提升之外,升级联通客户端还...

网友评论

    本文标题:版本升级功能(整包升级和差量升级)

    本文链接:https://www.haomeiwen.com/subject/jviwwctx.html