登录  /  注册
首页 > web前端 > uni-app > 正文

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

coldplay.xixi
发布: 2021-01-05 09:43:43
转载
4375人浏览过

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中文网其它相关文章!

智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
相关标签:
来源:CSDN网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
关于CSS思维导图的课件在哪? 课件
凡人来自于2024-04-16 10:10:18
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号