热更新(.wgt):只有前端资源或模块进行调整,整个App结构不发生变化,那只需要更新这一部分资源,避免用户重新下载整个App。通过 HBuilderX 打包 .wgt 包即可

整包更新(.apk):App 发生了非常大的改变,搭建框架发生改变,要求用户覆盖安装。

安卓比较好实现热更新,uniapp ios暂时无法实现热更新,只能跳转 Apple Store 下载更新

// 获取当前版本号
getVersion() {
		if (uni.getSystemInfoSync().platform == "ios") return
		plus.runtime.getProperty(plus.runtime.appid, wgtinfo => {
			let version = wgtinfo.version; // 版本号
			let versionName = wgtinfo.name; // 版本名称
			this.$api.updates({
				v: wgtinfo.version
			}).then(res => {

				if (res.data.code == 1) {
					let {
						data: versionInfo
					} = res.data
					if (versionInfo.type == "patch") { // 热更新
						this.updatePage(versionInfo.url, "wgt", Number(versionInfo.force), version,
							versionInfo.version)
					} else if (versionInfo.type == "upgrade") { // 整包更新
						this.updatePage(versionInfo.url, "apk", Number(versionInfo.force), version,
							versionInfo.version)
					} else {
						return
					}
				} else {
					console.log(res.data.msg);
				}
			})
		});
	},
	// 判断是否更新APP
	updatePage(downUrl, downType, force, oldV, newV) {

		// 提醒用户更新模态框
		uni.showModal({
			title: 'APP更新提示',
			content: `当前版本 V.${oldV},有更新的版本 V.${newV}\n是否更新升级?`, //更新接口提示的信息
			success: res => {
				// modal中点击确定
				if (res.confirm) {
					// 下载安装包
					this.downLoadPageAndInstall(downUrl, downType);
				} else {
					if (force) {
						plus.runtime.quit()
					}
				}
			},
			fail: error => {
				//发生错误
				console.log(error);
			}
		});
	},
	// 下载安装包
	downLoadPageAndInstall(downUrl, downType) {
		if (uni.getSystemInfoSync().platform == "android") {
			if (downType == "wgt") { // 热更新
				let downLoader = plus.downloader.createDownload(downUrl, { // 新建下载任务
					filename: "_doc/update/"
				}, function(d, status) {

					if (status == 200) { // 下载成功
						plus.nativeUI.showWaiting("正在安装...")
						// 安装wgt包
						plus.runtime.install(d.filename, {}, function() {
								plus.nativeUI.closeWaiting();
								plus.nativeUI.toast('应用资源更新完成', function() {
									plus.runtime.restart();
								});
							},
							function(e) {
								plus.nativeUI.toast('安装wgt文件失败[' + e.code + ']:' + e.message);
								console.log('安装wgt文件失败[' + e.code + ']:' + e.message);

							}); // 安装wgt包
					} else {
						plus.nativeUI.alert("下载wgt失败!");
					}
				})
				downLoader.start() // 开始下载
				let showLoading = plus.nativeUI.showWaiting("正在下载资源包"); // 提示框
				// 下载进度条
				let prg = 0;
				downLoader.addEventListener("statechanged", function(task, status) {
					switch (task.state) {
						case 1:
							showLoading.setTitle("正在下载");
							break;
						case 2:
							showLoading.setTitle("已连接到服务器");
							break;
						case 3:
							prg = parseInt(
								(parseFloat(task.downloadedSize) /
									parseFloat(task.totalSize)) *
								100
							);
							showLoading.setTitle(" 正在升级" + prg + "% ");
							break;
						case 4:
							plus.nativeUI.closeWaiting();
							break;
					}
				});
			} else if (downType == "apk") { // 整包更新
				let downLoader = plus.downloader.createDownload(downUrl, { // 新建下载任务
					filename: "_doc/update/"
				}, function(d, status) {

					if (status == 200) { // 下载成功
						plus.nativeUI.showWaiting("正在安装...")
						// 安装wgt包
						plus.runtime.install(d.filename, {}, function() {
								plus.nativeUI.closeWaiting();
								plus.nativeUI.toast('应用资源更新完成', function() {
									plus.runtime.restart();
								});
							},
							function(e) {
								plus.nativeUI.toast('安装apk文件失败[' + e.code + ']:' + e.message);
							}); // 安装wgt包
					} else {
						plus.nativeUI.alert("下载apk安装包失败!");
					}
				})
				downLoader.start() // 开始下载
				let showLoading = plus.nativeUI.showWaiting("正在下载安装包"); // 提示框
				// 下载进度条
				let prg = 0;
				downLoader.addEventListener("statechanged", function(task, status) {
					switch (task.state) {
						case 1:
							showLoading.setTitle("正在下载");
							break;
						case 2:
							showLoading.setTitle("已连接到服务器");
							break;
						case 3:
							prg = parseInt(
								(parseFloat(task.downloadedSize) /
									parseFloat(task.totalSize)) *
								100
							);
							showLoading.setTitle(" 正在下载" + prg + "% ");
							break;
						case 4:
							plus.nativeUI.closeWaiting();
							break;
					}
				});
			}
		} else if (uni.getSystemInfoSync().platform == "ios") {
			const appleId = 1640387468
			plus.runtime.launchApplication({
				action: `itms-apps://itunes.apple.com/cn/app/id${appleId}?mt=8`
			}, function(e) {
				console.log('Open system default browser failed: ' + e.message);
			});
		}
	}
}

Logo

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

更多推荐