DCloud_App_Array
DCloud_App_Array
  • 发布:2015-04-24 21:55
  • 更新:2021-10-14 18:30
  • 阅读:89783

App资源在线差量升级更新

分类:HTML5+

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

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

本文重点介绍5+应用资源差量升级,相对App资源独立升级,因为只需要下载更新的资源文件,所以升级包体积更小,升级速度会更快。
注意:需HBuilder5.7.0以上版本才有此功能

生成移动App资源差量升级包

顾名思义,差量升级包是针对某个历史版本到新版本的差量,所以对于升级服务器来讲需要保留所有历史版本,并且分别生成每个历史版本到新版本的差量升级包。
目前HBuilder IDE并未提供版本控制系统,所以需要按照以下规则手动生成差量升级包:

  • 差量升级包文件格式为wgtu
    在HTML5+移动App支持的差量升级包文件后缀名必须是wgtu,它是标准的zip压缩文件,可以使用任何zip工具对wgtu目录进行压缩,并修改文件后缀名称为wgtu。
  • wgtu目录结构
名称 类型 说明
www 目录 保存需要更新的数据文件,其下的目录结构与应用的目录结构一致,其下必须包含manifest.json文件,否则认为更新文件非法,不执行升级操作
update.xml 文件 保存应用升级操作的配置信息,参考update.xml文件格式
  • update.xml文件格式(注意:文件名必须全部小写)
    update.xml为标准的xml文件格式,定义wgtu文件升级配置信息,其文件格式如下:
元素名称 父元素 类型 描述 必须
wgtu 根节点
appid wgtu 属性 升级应用的appid
basis wgtu 节点 基础应用信息
version basis 属性 基础应用的版本信息(旧版本的版本号
remove wgtu 节点 升级需要删除的文件/目录列表
item remove 节点 需要删除的项
path item 属性 需要删除的项的路径,相对于应用根目录,如“image/a.png”表示image目录下的a.png文件。如果是目录则以‘/’结尾,如“res/img/”表示res目录下的img目录,删除时包括下的所有内容。
  • wgtu示例
    应用升级前的版本1.0,其应用目录结构为:

    应用升级后的版本1.1,其应用目录结构为:

    差量升级包wgtu文件的目录结构为(不包括最外层wgtu目录):

    应用升级更新文件manifest.json、index.html,新增detail.html、image/new.png,删除image/icon5.png。
    其中update.xml中的内容为:
    <?xml version="1.0" encoding="utf-8" standalone="no"?>  
    <wgtu appid="TEST" >  
    <basis version="1.0" />  
    <remove>  
    <item path="image/icon5.png" />  
    </remove>  
    </wgtu>

应用中差量更新资源

下载wgtu文件并更新:

    var url='http://demo.dcloud.net.cn/helloh5/update/HelloH5.wgtu';  
    plus.nativeUI.showWaiting("升级中...");  
    var dtask = plus.downloader.createDownload( url, {method:"GET"}, function(d,status){  
        if ( status == 200 ) {   
            console.log( "Download wgtu success: " + d.filename );  
            plus.runtime.install(d.filename,{},function(){  
                plus.nativeUI.closeWaiting();  
                plus.nativeUI.alert("Update wgtu success, restart now!",function(){  
                    plus.runtime.restart();  
                });  
            },function(e){  
                plus.nativeUI.closeWaiting();  
                alert("Update wgtu failed: "+e.message);  
            });  
        } else {  
            plus.nativeUI.closeWaiting();  
             alert( "Download wgtu failed: " + status );   
        }   
    } );  
    dtask.addEventListener('statechanged',function(d,status){  
        console.log("statechanged: "+d.state);  
    });  
    dtask.start();

注意

  1. wgtu包中的update.xml文件名称必须全部小写,并且和www在同一级目录中
  2. wgtu包中www目录下必须包含manifest.json文件,并且里面不能包含注释(HBuilder中默认带注释,需要手动删除所有注释)
  3. update.xml中的appid值是应用的AppID(如“H5F6AE111”),不是程序的包名(如“io.dcloud.H5F6AE1111”)
  4. wgtu包必须是使用zip格式压缩的文件(不能使用如rar等其它压缩格式)

App store应用更新说明
应用资源更新肯定是违反apple政策的,但目前看起来它也不管。你在官网案例那里下载Appstore版本的那些app,大多启动后都会提示更新,反正也都没下架。如果你不是很大的公司,apple不会理睬你。如果你是大公司,建议不要做整体更新,每次更新几个页面,也不要提示更新后需要重启,这样会安全点。

感谢 @大裤子 反馈建议更新补充文档,wgtu更新经验分享:http://ask.dcloud.net.cn/question/6353

44 关注 分享
蔡繁荣 杨羊羊 ztingjian 半杯可乐 小手真黑 古丶木风 飞羽 小小雨 gerry 布洛瓷 NyxFang BoredApe 埃文 不知道 天行 果汁 木子喵 望月孤魂 江南长 除膜慰道 妙妙 holy1004 yinzhq12 止水 夜汨 Trust _burt 2***@qq.com 赵 skysowe atongmu 启程588 1***@qq.com 3***@qq.com 6***@qq.com 银少 4***@qq.com 1***@qq.com studio jzq84229 1***@qq.com 7***@qq.com m***@gmail.com 理子

要回复文章请先登录注册

元玉

元玉

设置了 {force:true} 后,安卓还是会出现update.xml中version版本不匹配的错误信息,请问是bug吗?
2016-03-01 16:22
yinzhq12

yinzhq12

回复 Lalapalooza :
manifest.json里的版本号不是应该改嘛?
2016-01-28 15:58
yinzhq12

yinzhq12

第一次使用Hbuilder,不知从哪里做差量升级,哪位大神给个Demo呢?
2016-01-28 15:19
moliu

moliu

回复 javake :
我也是这样,你找到解决方法没有
2016-01-22 10:30
鸿运当头

鸿运当头

回复 fategaga :
下载地址是:https://github.com/jinle/gen-wgtu
2015-11-03 11:31
wind

wind

我有个最新的经验要分享下的,大家记得要添加:”downloader“这个模块,因为我之前觉得这个没什么卵用,所以一直都删除了,在manifest.json里面!
2015-10-31 22:20
望月孤魂

望月孤魂

回复 kei :
增量更新成功也调用了plus.runtime.restart(),但是html/js/css还是更新前的?怎么解决?
2015-10-21 16:00
望月孤魂

望月孤魂

回复 Lalapalooza :
获取版本号时不要使用plus.runtime.version(猜测获取的是应用的版本号,而不是manifest.json),使用plus.runtime.getProperty(plus.runtime.appid, function(info) {
var version = info.version;});
能够获取manifest.json的版本号,就能够正常获取增量更新后的版本号
2015-10-20 17:41
望月孤魂

望月孤魂

回复 Lalapalooza :
我也正想问这个问题? 和你的一模一样,而且我发现更新完成后调用plus.runtime.restart()重启后,html页面是更新后的,但是js还是旧版本的,手动重启应用后就好了。(Android环境)
2015-10-20 17:25
Lalapalooza

Lalapalooza

差量更新成功了,但是版本号还是原来的版本号,这样每次启动都提示要更新了! ? 怎么破
2015-10-17 12:10