首页 web前端 uni-app 介绍 uni-app在线升级和热更新实现

介绍 uni-app在线升级和热更新实现

Jan 05, 2021 am 09:43 AM
uni-app 在线升级 热更新

uniapp开发教程栏目分析APP升级的业务

介绍 uni-app在线升级和热更新实现

推荐(免费):uniapp开发教程

第一、分析APP升级的业务

1、每次打开APP需要在全局App.vue中去检测请求后台接口

2、对比版本号校验是否升级 

3、识别是热更新还是在线升级,处理不同业务,热更新下载包使用官方api升级(按照实际接口返回字段判断)

4、识别是强制升级还是非强制升级 弹框提醒用户

5、识别是IOS还是Android升级 用户点击跳转升级

第二、编写代码

1、进入APP.vue  onLaunch下

2、按照业务分析编写升级代码

//#ifdef APP-PLUS
			// APP检测更新 具体打包流程可以参考:https://ask.dcloud.net.cn/article/35667
			plus.screen.lockOrientation('portrait-primary'); //竖屏正方向锁定
            //获取是否热更新过
			const updated = uni.getStorageSync('updated'); // 尝试读取storage

			if (updated.completed === true) {
				// 如果上次刚更新过
				// 删除安装包及安装记录
				console.log('安装记录被删除,更新成功');
				uni.removeSavedFile({
					filePath: updated.packgePath,
					success: res => {
						uni.removeStorageSync('updated');
					}
				});
			} else if (updated.completed === false) {
				uni.removeStorageSync('updated');
				plus.runtime.install(updated.packgePath, {
					force: true
				});
				uni.setStorage({
					key: 'updated',
					data: {
						completed: true,
						packgePath: updated.packgePath
					},
					success: res => {
						console.log('成功安装上次的更新,应用需要重启才能继续完成');
					}
				});
				uni.showModal({
					title: '提示',
					content: '应用将重启以完成更新',
					showCancel: false,
					complete: () => {
						plus.runtime.restart();
					}
				});
			} else {
				//获取当前系统版本信息
				plus.runtime.getProperty(plus.runtime.appid, widgetInfo => {
					//请求后台接口 解析数据 对比版本
					this.$Request.getT('/appinfo/').then(res => {
						res = res.data[0];
						if (res.wgtUrl && widgetInfo.version < res.version) {
							let downloadLink = &#39;&#39;;
							let androidLink = res.androidWgtUrl;
							let iosLink = res.iosWgtUrl;
							let ready = false;
							//校验是是不是热更新
							if (res.wgtUrl.match(RegExp(/.wgt/))) {
								// 判断系统类型
								if (plus.os.name.toLowerCase() === &#39;android&#39;) {
									console.log(&#39;安卓系统&#39;);
									if (androidLink && androidLink !== &#39;#&#39;) {
										// 我这里默认#也是没有地址,请根据业务自行修改
										console.log(&#39;发现下载地址&#39;);
										// 安卓:创建下载任务
										if (androidLink.match(RegExp(/.wgt/))) {
											console.log(&#39;确认wgt热更新包&#39;);
											downloadLink = androidLink;
											ready = true;
										} else {
											console.log(&#39;安卓推荐.wgt强制更新,.apk的强制更新请您自行修改程序&#39;);
										}
									} else {
										console.log(&#39;下载地址是空的,无法继续&#39;);
									}
								} else {
									console.log(&#39;苹果系统&#39;);
									if (iosLink && iosLink !== &#39;#&#39;) {
										// 我这里默认#也是没有地址,请根据业务自行修改
										console.log(&#39;发现下载地址&#39;);
										// 苹果(A):进行热更新(如果iosLink是wgt更新包的下载地址)判断文件名中是否含有.wgt
										if (iosLink.match(RegExp(/.wgt/))) {
											console.log(&#39;确认wgt热更新包&#39;);
											downloadLink = iosLink;
											ready = true;
										} else {
											console.log(&#39;苹果只支持.wgt强制更新&#39;);
										}
									} else {
										console.log(&#39;下载地址是空的,无法继续&#39;);
									}
								}
								if (ready) {
									console.log(&#39;任务开始&#39;);
									let downloadTask = uni.downloadFile({
										url: downloadLink,
										success: res => {
											if (res.statusCode === 200) {
												// 保存下载的安装包
												console.log(&#39;保存安装包&#39;);
												uni.saveFile({
													tempFilePath: res.tempFilePath,
													success: res => {
														const packgePath = res.savedFilePath;
														// 保存更新记录到stroage,下次启动app时安装更新
														uni.setStorage({
															key: &#39;updated&#39;,
															data: {
																completed: false,
																packgePath: packgePath
															},
															success: () => {
																console.log(&#39;成功保存记录&#39;);
															}
														});
														// 任务完成,关闭下载任务
														console.log(&#39;任务完成,关闭下载任务,下一次启动应用时将安装更新&#39;);
														downloadTask.abort();
														downloadTask = null;
													}
												});
											}
										}
									});
								} else {
									console.log(&#39;下载地址未准备,无法开启下载任务&#39;);
								}
							} else {
								//不是热更新是在线更新 校验是否强制升级
								if (res.method == &#39;true&#39;) {
									uni.showModal({
										showCancel: false,
										confirmText: &#39;立即更新&#39;,
										title: &#39;发现新版本&#39;,
										content: res.des,
										success: res => {
											if (res.confirm) {
												this.$queue.showLoading(&#39;下载中...&#39;);
												if (uni.getSystemInfoSync().platform == &#39;android&#39;) {
													uni.downloadFile({
														url: androidLink,
														success: downloadResult => {
															if (downloadResult.statusCode === 200) {
																plus.runtime.install(
																	downloadResult.tempFilePath, {
																		force: false
																	},
																	d => {
																		console.log(&#39;install success...&#39;);
																		plus.runtime.restart();
																	},
																	e => {
																		console.error(&#39;install fail...&#39;);
																	}
																);
															}
														}
													});
												}
												if (uni.getSystemInfoSync().platform == &#39;ios&#39;) {
													plus.runtime.openURL(iosLink, function(res) {});
												}
											} else if (res.cancel) {
												console.log(&#39;取消&#39;);
											}
										}
									});
								} else {
									uni.showModal({
										title: &#39;发现新版本&#39;,
										confirmText: &#39;立即更新&#39;,
										cancelText: &#39;下次更新&#39;,
										content: res.des,
										success: res => {
											if (res.confirm) {
												this.$queue.showLoading(&#39;下载中...&#39;);
												if (uni.getSystemInfoSync().platform == &#39;android&#39;) {
													uni.downloadFile({
														url: androidLink,
														success: downloadResult => {
															if (downloadResult.statusCode === 200) {
																plus.runtime.install(
																	downloadResult.tempFilePath, {
																		force: false
																	},
																	d => {
																		console.log(&#39;install success...&#39;);
																		plus.runtime.restart();
																	},
																	e => {
																		console.error(&#39;install fail...&#39;);
																	}
																);
															}
														}
													});
												}
												if (uni.getSystemInfoSync().platform == &#39;ios&#39;) {
													plus.runtime.openURL(iosLink, function(res) {});
												}
											} else if (res.cancel) {
												console.log(&#39;取消&#39;);
											}
										}
									});
								}
							}
						}
					});
				});
			}

			//#endif
登录后复制

以上是介绍 uni-app在线升级和热更新实现的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1662
14
CakePHP 教程
1418
52
Laravel 教程
1311
25
PHP教程
1261
29
C# 教程
1234
24
VSCode中如何开发uni-app?(教程分享) VSCode中如何开发uni-app?(教程分享) May 13, 2022 pm 08:11 PM

VSCode中如何开发uni-app?下面本篇文章给大家分享一下VSCode中开发uni-app的教程,这可能是最好、最详细的教程了。快来看看!

利用uniapp开发一个简单的地图导航 利用uniapp开发一个简单的地图导航 Jun 09, 2022 pm 07:46 PM

怎么利用uniapp开发一个简单的地图导航?本篇文章就来为大家提供一个制作简单地图的思路,希望对大家有所帮助!

聊聊如何利用uniapp开发一个贪吃蛇小游戏! 聊聊如何利用uniapp开发一个贪吃蛇小游戏! May 20, 2022 pm 07:56 PM

如何利用uniapp开发一个贪吃蛇小游戏?下面本篇文章就手把手带大家在uniapp中实现贪吃蛇小游戏,希望对大家有所帮助!

uni-app vue3接口请求怎么封装 uni-app vue3接口请求怎么封装 May 11, 2023 pm 07:28 PM

uni-app接口,全局方法封装1.在根目录创建一个api文件,在api文件夹中创建api.js,baseUrl.js和http.js文件2.baseUrl.js文件代码exportdefault"https://XXXX.test03.qcw800.com/api/"3.http.js文件代码exportfunctionhttps(opts,data){lethttpDefaultOpts={url:opts.url,data:data,method:opts.method

手把手带你开发一个uni-app日历插件(并发布) 手把手带你开发一个uni-app日历插件(并发布) Jun 30, 2022 pm 08:13 PM

本篇文章手把手带大家开发一个uni-app日历插件,介绍下一款日历插件是如何从开发到发布的,希望对大家有所帮助!

实例讲解uniapp实现多选框的全选功能 实例讲解uniapp实现多选框的全选功能 Jun 22, 2022 am 11:57 AM

本篇文章给大家带来了关于uniapp的相关知识,其中主要整理了实现多选框的全选功能的相关问题,无法实现全选的原因是动态修改checkbox的checked字段时,界面上的状态能够实时变化,但是无法触发checkbox-group的change事件,下面一起来看一下,希望对大家有帮助。

聊聊uniapp的scroll-view下拉加载 聊聊uniapp的scroll-view下拉加载 Jul 14, 2022 pm 09:07 PM

uniapp怎么实现scroll-view下拉加载?下面本篇文章聊聊uniapp微信小程序scroll-view的下拉加载,希望对大家有所帮助!

实例详解uniapp如何实现电话录音功能(附代码) 实例详解uniapp如何实现电话录音功能(附代码) Jan 05, 2023 pm 04:41 PM

本篇文章给大家带来了关于uniapp的相关知识,其中主要介绍了怎么用uniapp实现拨打电话并且还能同步录音的功能,感兴趣的朋友一起来看一下吧,希望对大家有帮助。

See all articles