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

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 段长发 断想

要回复文章请先登录注册

2***@qq.com

2***@qq.com

请问热更新返回的状态码downloadResult.statusCode为400是什么?之前一直都是正常的返回200,这几天打开看提示uni.downloadFile -> downloadResult.statusCode === 400,状态返回400我该怎么解决?
2020-06-11 16:26
DCloud_App_Array

DCloud_App_Array (作者)

回复 野良猫 :
提示新版本是因为升级检测逻辑代码判断的吧
2020-06-04 20:02
[已删除]

[已删除]

回复 野良猫 :
我也是,一直提示我重启,你解决了吗?
2020-06-04 18:34
野良猫

野良猫

restart重启app之后,新的内容已经成功更新,但是还是会提示新版本,不知道什么情况
2020-05-29 17:15
8***@qq.com

8***@qq.com

回复 滚滚红尘 :
为什么我设置好 点击更新 没反应
2020-04-21 19:22
1***@qq.com

1***@qq.com

升级后版本号没变是什么情况?
2019-12-27 20:41
初学小菜鸡

初学小菜鸡

回复 1***@qq.com :
包名一样的,我试了下,如果不改变版本号的话,就会覆盖掉
2019-12-03 09:43
1***@qq.com

1***@qq.com

回复 初学小菜鸡 :
app的包名不一样吧
2019-11-28 16:23
1***@qq.com

1***@qq.com

17:14:16.672 下载wgt成功:{"id":"dt101574154864142","url":"http://192.168.0.163:80//static/d3b0dbc0-71fc-4eaa-bead-e60efbc9124b.wgt","downloadedSize":36,"totalSize":0,"options":{"filename":"_doc/update/"},"filename":"_doc/update/f(3).txt","method":"GET","timeout":120,"retry":3,"retryInterval":30,"priority":1,"eventHandlers":{},"data":null,"__requestHeaders__":{},"__responseHeaders__":{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"POST, GET, OPTIONS, DELETE","Access-Control-Max-Age":"3600","Access-Control-Allow-Headers":"x-requested-with,sso_token,hjbvisa","Content-Disposition":"inline;filename=f.txt","Content-Type":"application/json;charset=UTF-8","Transfer-Encoding":"chunked","Date":"Tue, 19 Nov 2019 09:13:50 GMT","X-Android-Sent-Millis":"1574154864289","X-Android-Received-Millis":"1574154864320","X-Android-Selected-Protocol":"http/1.1","X-Android-Response-Source":"NETWORK 200"},"__noParseResponseHeader__":null,"__cacheReponseHeaders__":{},"state":4} at App.vue:43
17:14:16.692 安装wgt文件失败[-1201]:WGT/WGTU文件格式错误 at App.vue:57
2019-11-19 17:16
山顶上有只傻狗

山顶上有只傻狗

回复 DCloud_App_Array :
打包有勾选统计模块,热更新还是会提示这个{"code":-1229,"message":"HTML5+ Runtime缺少升级包manifest.json中配置的模块:statistic"}
2019-11-13 11:54