uni-app打包apk实现自动更新

一、直接复制粘贴就可用(豪横)

app.vue文件里写

//app.vue里写
<script>
	export default {
		onShow: function() {
			console.log('App Show')
		},
		onHide: function() {
			console.log('App Hide')
		},
		onLaunch: function() {
			let appVersion = ''
			uni.getSystemInfo({
				success: function(e) {
					appVersion = e.platform
				}
			})
			let that = this;
			uni.request({
				url: 'http://xxx.xxx.xxx:3000/xxx/xxx', //获取版本号接口。
				method: "POST",
				header: {
					'custom-header': 'application/json;' //自定义请求头信息
				},
				success: (res) => {
					const arr1 = uni.getSystemInfoSync().appVersion.split('.');
					const arr2 = res.data.split('.')
					if (parseInt(arr2[2]) > parseInt(arr1[2])) {
						uni.showModal({
							title: "版本更新",
							content: '检测到有新版本,是否更新', //更新描述
							confirmText: '立即更新',
							cancelText: '稍后进行',
							success: (r) => {
								if (r.confirm) {
									//如果是安卓直接更新下载
									if (appVersion === 'android') {
										uni.showLoading({
											title: '正在下载,请稍后'
										})
										uni.downloadFile({
											// 存放最新安装包的地址
											url: 'http://xxx.xxx.xxx:3000/apk/xxx/xxx.apk',
											success: (downloadResult) => {
												uni.hideLoading();
												if (downloadResult.statusCode ===200) {
													uni.hideLoading();
													plus.runtime.install(
														downloadResult
														.tempFilePath, {
															force: false
														},
														function() {
															console.log(
																'install success...'
																);
															plus.runtime
																.restart();
														},
														function(e) {
															uni.hideLoading();
															console.error(
																'install fail...'
																);
														});
												}
											}
										});
										//如果是ios跳转到app store
									} else {
										//在App Store Connect中的App Store下的app信息,可找到appleId
										let appleId = plus.runtime.appid
										plus.runtime.launchApplication({
											action: `itms-apps://itunes.apple.com/cn/app/id${appleId}?mt=8`
										}, function(e) {
											uni.showToast({
												title: '打开应用商店失败'
											})
											console.log(
												'打开应用商店失败: ' +
												e.message);
										});
									}
								} else if (res.cancel) {
									console.log('用户点击取消');
								}
							}
						})
					}

				},

			});
		},
	}
</script>

<style>
	/*每个页面公共css */
</style>

二、详解(复制粘贴行不通呢,就详细看看每行的注释,相信我,花费三分钟时间,比你点开一堆链接去一步一步排查好。嘿嘿!除非你想摸鱼)

<script>
	export default {
		onLaunch: function() {
			let appVersion = ''
			uni.getSystemInfo({   //获取当前的apk是安卓还是ios,
				success: function(e) {
					appVersion = e.platform    // console打印的值为android
				}
			})
			let that = this;
			uni.request({
				url: 'http://xxx.xxx.xxx:3000/xxx/xxx', //获取版本号接口。
				method: "POST",
				header: {
					'custom-header': 'application/json;' //自定义请求头信息
				},
				success: (res) => {
				    //uni.getSystemInfoSync()返回的是apk包信息,uni自带,可自行打印查看.
					const arr1 = uni.getSystemInfoSync().appVersion.split('.');
					//arr2接口返回的版本信息(1.0.0),处理一下成数组。
					const arr2 = res.data.split('.')
					console.log(uni.getSystemInfoSync(), '这是uni.getSystemInfoSync()')
					console.log(arr1, '这是arr1')
					console.log(arr2, "这是arr2arr2")
					//parseInt(arr2[2]) > parseInt(arr1[2])我自己想偷懒,只校验最后一位版本号的大小,你要是想非常规矩校验版本号呢,就自己写写js逻辑,先判断第一位,在判断第二位,在判断第三位
					if (parseInt(arr2[2]) > parseInt(arr1[2])) {
						uni.showModal({
							title: "版本更新",
							content: '检测到有新版本,是否更新', //更新描述
							confirmText: '立即更新',
							cancelText: '稍后进行',
							success: (r) => {
								if (r.confirm) {
									//如果是安卓直接更新下载
									if (appVersion === 'android') {
										uni.showLoading({
											title: '正在下载,请稍后'
										})
										//这块用downloadFile下载最新的apk包,
										uni.downloadFile({
											// 存放最新安装包的地址
											url: 'http://xxx.xxx.xxx:3000/apk/xxx/xxx.apk',
											success: (downloadResult) => {
												uni.hideLoading();
												if (downloadResult.statusCode ===200) {
													uni.hideLoading();
													//plus.runtime.install这个是啥东西,别问,问了我也不知道,而且运行到浏览器还报错,那就对了,直接打包到真机上,相信自己没问题
													plus.runtime.install(
														downloadResult
														.tempFilePath, {
															force: false
														},
														function() {
															console.log(
																'install success...'
																);
															plus.runtime
																.restart();
														},
														function(e) {
															uni.hideLoading();
															console.error(
																'install fail...'
																);
														});
												}
											}
										});
										//如果是ios跳转到app store
									} else {
										//在App Store Connect中的App Store下的app信息,可找到appleId
										//这块ios更新,我还是不知道,因为我们只做安卓的,究竟管不管用,自己试试吧
										let appleId = plus.runtime.appid
										plus.runtime.launchApplication({
											action: `itms-apps://itunes.apple.com/cn/app/id${appleId}?mt=8`
										}, function(e) {
											uni.showToast({
												title: '打开应用商店失败'
											})
											console.log(
												'打开应用商店失败: ' +
												e.message);
										});
									}
								} else if (res.cancel) {
									console.log('用户点击取消');
								}
							}
						})
					}

				},

			});
		},
	}
</script>

uni-app打包apk实现自动更新_第1张图片

uni-app打包apk实现自动更新_第2张图片

有疑问或者更好的实现方案可以评论一起探讨

你可能感兴趣的:(uni-app,uni-app)