经常在做app的时候,会有做热更新的需求,这也是常用的更新app的一种手段。

当你每次发版不想更新整个app安装包时,可以采用差量更新。在HBuilderx中提供了这个wgt包,

 将打出来的包给后端放在服务器上,后端会提供一个下载链接。

下面是实现热更新的具体方法:

// 检查是否更新版本
updateVersion() {
    // 热更新不会更新app的版本号
	// 这里用一个常量定义(每次修改版本号将设置里面的版本号手动更新)
	let realVersion = '1012';
	//plus.runtime.getProperty(),获取本机安装的版本,具体使用请参照如下链接    
	//https://www.html5plus.org/doc/zh_cn/runtime.html#plus.runtime.WidgetInfo
	plus.runtime.getProperty(plus.runtime.appid, function(widgetInfo) {
		let currentVersion = widgetInfo.version.replace(/\./g, ""); //获取当前版本号
		sendVersion().then(res => {
			const code = res.data.code;
			if (code === 100) {
				let newVersion = res.data.data.id;
				let downloadUrl = res.data.data.downloadUrl;
				if (realVersion < newVersion) {
					uni.showModal({
						title: '已发现新版本',
						content: '确认更新?',
						success: function(res) {
							if (res.confirm) {
								uni.downloadFile({
									url: downloadUrl,
									success: (downloadResult) => {
										plus.runtime.install(
											downloadResult
											.tempFilePath, {
													force: true
											},
											function() {
											// 应用热重启,重新启动进入首页。
												plus.runtime.restart();
													uni.showModal({
													    title: '安装成功!',
														content: '已重新进入应用',
														success: function(res) {
																	if (res.confirm) {
																		console.log('用户点击确定');
																	} else if(res.cancel)                 {
                                                                        console.log('用户点击取消');
																	}
																}
															});
															// uni.hideToast();
														},
														function(e) {
															uni.showToast({
																title: '安装失败',
																icon: 'none'
															})
														})
												},
												fail: (err) => {
													console.log(err)
													uni.showToast({
														title: '下载失败',
														icon: 'none'
													})
												}
											})
										} else if (res.cancel) {
											uni.showToast({
												title: '已取消',
												icon: 'none'
											})
										}
									}
								})
							}
						} else {
							uni.showToast({
								title: res.data.msg,
								icon: 'none'
							})
						}

					}).catch(err => {
						console.log(err)
					})

				})
			},

1.plus.runtime.getProperty()方法是用于获取当前app的版本号,也就是在mainfest.json中设置的版本号。将获取的版本号与后端返回的版本号做对比,如果后端返回的版本号大于当前app版本号则提示更新。但是在做这个需求是遇到一个问题,热更新是不会更新当前app的版本号的,所以之后定义了一个常量realVersion来放每次更新的真正的版本号。

2.uni.downloadFile()方法是用于下载新的wgt包的,根据后端返回的链接下载;

3.plus.runtime.install()方法是用于安装下载后的wgt包的

4.每次更新wgt包之前需要修改版本号,只有版本号比上一次高才会触发更新,ios和安卓都是一样的。

如有问题,欢迎留言!!!

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐