DCloud_App_Array
DCloud_App_Array
  • 发布:2015-03-15 23:28
  • 更新:2023-08-03 14:55
  • 阅读:352894

App资源在线升级更新

分类:HTML5+

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

注意:uni-app的热更新另见文档https://ask.dcloud.net.cn/article/35667

5+应用可使用以下方式进行升级

本文重点介绍5+应用资源独立升级,相对整包升级有以下优势:

  1. 无需重新提交应用市场审核更新,降低更新周期;
  2. 无需用户手动点击操作安装更新,优化用户体验;
  3. App资源相对整包体积更小,升级速度更快。

生成移动App资源升级包

  • 在HBuilder中编辑好新的移动App资源后,更新manifest.json的版本号
    原来版本是1.0,新版本修改为2.0:

  • 在HBuilder中生成升级包文件(wgt)
    菜单“发行” -> “制作移动App资源升级包”:

    在以下界面中通过“浏览”按钮选择保存路径,点击“确定”保存wgt文件:

  • 生成wgt后提交到手机可访问的网络地址
    App资源升级包下载地址:
    http://www.dcloud.io/docs/a/update/H5EF3C469.wgt
    为了模拟正常的升级检测流程,添加以下检测升级地址(返回最新版本号):
    http://demo.dcloud.net.cn/test/update/check.php

应用中检测更新资源

检测服务器上是否有新版本

  • 获取当前应用的版本号

    var wgtVer=null;  
    function plusReady(){  
    // ......  
    // 获取本地应用资源版本号  
    plus.runtime.getProperty(plus.runtime.appid,function(inf){  
        wgtVer=inf.version;  
        console.log("当前应用版本:"+wgtVer);  
    });  
    }  
    if(window.plus){  
    plusReady();  
    }else{  
    document.addEventListener('plusready',plusReady,false);  
    }
  • 发起ajax请求检测是否有新版本

    // 检测更新  
    var checkUrl="http://demo.dcloud.net.cn/test/update/check.php";  
    function checkUpdate(){  
    plus.nativeUI.showWaiting("检测更新...");  
    var xhr=new XMLHttpRequest();  
    xhr.onreadystatechange=function(){  
        switch(xhr.readyState){  
            case 4:  
            plus.nativeUI.closeWaiting();  
            if(xhr.status==200){  
                console.log("检测更新成功:"+xhr.responseText);  
                var newVer=xhr.responseText;  
                if(wgtVer&&newVer&&(wgtVer!=newVer)){  
                    downWgt();  // 下载升级包  
                }else{  
                    plus.nativeUI.alert("无新版本可更新!");  
                }  
            }else{  
                console.log("检测更新失败!");  
                plus.nativeUI.alert("检测更新失败!");  
            }  
            break;  
            default:  
            break;  
        }  
    }  
    xhr.open('GET',checkUrl);  
    xhr.send();  
    }

更新应用资源

  • 从服务器下载应用资源包(wgt文件)

    // 下载wgt文件  
    var wgtUrl="http://demo.dcloud.net.cn/test/update/H5EF3C469.wgt";  
    function downWgt(){  
    plus.nativeUI.showWaiting("下载wgt文件...");  
    plus.downloader.createDownload( wgtUrl, {filename:"_doc/update/"}, function(d,status){  
        if ( status == 200 ) {   
            console.log("下载wgt成功:"+d.filename);  
            installWgt(d.filename); // 安装wgt包  
        } else {  
            console.log("下载wgt失败!");  
            plus.nativeUI.alert("下载wgt失败!");  
        }  
        plus.nativeUI.closeWaiting();  
    }).start();  
    }
  • 更新应用资源包(wgt文件)

    // 更新应用资源  
    function installWgt(path){  
    plus.nativeUI.showWaiting("安装wgt文件...");  
    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);  
    });  
    }

    wgt更新原生层是通过文件夹重命名方式实现,要么全部更新成功,要么更新失败,不会出现仅部分文件更新的情况

其它可改进的思路

  • 检测更新更好的模式应该是客户端提交本地应用资源版本号到升级服务器,由升级服务器判断是否可更新并且返回App升级资源包下载地址,避免在客户端写资源下载地址;
  • 更新时可以在后台静默下载,下次启动是直接更新,避免更新时打断用户操作。
  • 差量升级更新App资源,参考App资源在线差量升级更新

附件testUpdate.zip为测试移动App包

App store应用更新说明
应用资源更新肯定是违反apple政策的,但目前看起来,如果你不是很大的公司,apple不会理睬你。如果你是大公司,建议不要做整体更新,每次更新几个页面,也不要提示更新后需要重启,这样会安全点。

78 关注 分享
向着太阳 hilongjw andywang qinerg 逍涯 Mr丶Leo Julien Mars_Zhong Liosixer testemule syz 冰青虫 小米粒 dglhz Back Met magengshun haha2021a Amber0376 ffffffffff 淮风皖韵 c***@126.com 4***@qq.com ROBOT10086 Lanman_Group 1***@qq.com 老醒 Trust Jose w***@163.com 3***@qq.com 兔子x jtshushu 3***@qq.com 1***@qq.com 漠 dxTOP 来小新 m***@msn.cn 马振丹 j***@163.com y***@163.com m***@sina.com JSail MR不靠谱 飘过大山 1***@qq.com Viccy 段长发 断想

要回复文章请先登录注册

5***@qq.com

5***@qq.com

问下我司的app热更新后,原来下载过app的老用户是可以在线升级的,但是第一次下载的用户会报错误,可能是以前的版本等原因,目前不知道是什么原因,各位同学有没有遇到过呢
2019-04-24 16:59
hugo_yu

hugo_yu

plus.runtime.getProperty(plus.runtime.appid,function(inf){
wgtVer=inf.version;
console.log("当前应用版本:"+wgtVer);
}); 获取的版本号怎么是空的?
2019-04-22 15:18
uuundefined

uuundefined

没更新前默认打开的是_doc/html目录, 更新完5+会检测_doc/update目录打开吗
2019-02-15 14:18
苏颖

苏颖

请求相关技术援助:
hbuilder 移动APP在线升级时报错 not a zip archive
经过plus.runtime.install 调用之后打印出来的结果是:
{"code":10,"message":"Not a zip archive"}
2018-11-01 09:52
5***@qq.com

5***@qq.com

回复 来小新 :
我也想知道这个问题
2018-10-09 10:32
1***@qq.com

1***@qq.com

回复 前端小学僧 :
解决了吗,同样的问题
2018-09-26 09:28
w***@yeah.net

w***@yeah.net

前阵子遇到一直升级失败的原因,后来发现是因为新的APP增加了新的权限。升级包是无法更新权限的,这种情况只能重新下载个有新权限的APP才行。
2018-07-09 16:31
滚滚红尘

滚滚红尘

按照这个方法试了下,是能检测更新,但是不知为何提示安装wgt失败,后来搞搞装成功了,但是更新后app确实是新版的了,但是app软件的版本号却还是升级前的版本号,没变。搜索了下说是这样升级只是更新了资源包,反正一大堆问题,这么多用户留言就看出来了每个人遇到的问题都不一样。。。不过我顺着这个思路,我改了一下下载方式,就是不安装wgt,只要有更新,用户点击检测更新后直接跳转到app下载页,这样就是让用户重新安装新版的安装包,不在使用wgt资源升级包,这样就可以完全避免出现上面很多人提到的各种问题。目前来说是一个很好的解决方法。

代码贴上来給各位分享一下:
<script type="text/javascript">
var wgtVer=null;
function plusReady(){
// Android处理返回键
plus.key.addEventListener('backbutton',function(){
if(confirm('确认退出?')){
plus.runtime.quit();
}
},false);
// 获取本地应用资源版本号
plus.runtime.getProperty(plus.runtime.appid,function(inf){
wgtVer=inf.version;
console.log("当前应用版本:"+wgtVer);
});
}
if(window.plus){
plusReady();
}else{
document.addEventListener('plusready',plusReady,false);
}
// 检测更新
var checkUrl="http://xxxx.com/app/check.php"; /*换成你自己的检测地址,很多小白们不知道check.php源代码里面有啥,其实啥也没有,只有需要更新的版本号,新建一个空包php文件 代码里只要写一个需要更新的版本号即可,例如:1.5 */
function checkUpdate(){
plus.nativeUI.showWaiting("检测更新...");
var xhr=new XMLHttpRequest();
xhr.onreadystatechange=function(){
switch(xhr.readyState){
case 4:
plus.nativeUI.closeWaiting();
if(xhr.status==200){
console.log("检测更新成功:"+xhr.responseText);
var newVer=xhr.responseText;
if(wgtVer&&newVer&&(wgtVer!=newVer)){
downWgt();
}else{
plus.nativeUI.alert("已是最新版,无需更新!");
}
}else{
console.log("检测失败");
plus.nativeUI.alert("检测失败!");
}
break;
default:
break;
}
}
xhr.open('GET',checkUrl);
xhr.send();
}
// 打开app下载页面
var Url="http://xxxx.com/app/index.html";/*换成你自己的下载页*/
function downWgt(){
plus.nativeUI.showWaiting("软件有更新,将跳转到下载页...");
plus.downloader.createDownload( Url, {filename:"wode.html"}, function(d,status){ /*wode.html可以默认不用改,留着就行了*/
if ( status == 200 ) {
console.log("成功:"+d.filename);
open(d.filename); // 打开下载地址
/*installWgt(d.filename);
} else {
console.log("打开下载页面失败!");
plus.nativeUI.alert("打开下载页面失败!");
}
plus.nativeUI.closeWaiting();
}).start();
}

</script>


html端:<a href="javascript:" onClick="checkUpdate()">点击更新</a>
2018-06-25 02:38
1***@qq.com

1***@qq.com

我遇到一个问题,app进行资源升级的时候,第一次资源升级
2018-06-20 11:17
4***@qq.com

4***@qq.com

回复 6***@qq.com :
解决了么?我遇到这个问题了,能告诉下怎么解决吗?
2018-05-18 15:56