uniapp - 实现安卓APP实时在线更新APP

思路:启动APP时,需要一个接口提供是否有APP包更新,通过接口返回更新包的版本号、更新地址进等信息,通过获取app包版本号与更新包的版本号进行比较来进行更新。

一、发布蒲公英平台,进行实时APP更新(方案一)

1、获取manifest.json里的配置信息:plus.runtime.getProperty(plus.runtime.appid, function(widgetinfo) {})。

2、通过蒲公英api, 检测App是否有更新 接口获取APP更新内容,蒲公英 - 文档中心 - API 2.0

 appKey值是APP唯一的key

3、用户版本号小于升级包版本号,先升级。

直接上代码:封装的方法可直接调用

export function checkUpdateApp() {
	//  获取manifest.json里的配置信息
	plus.runtime.getProperty(plus.runtime.appid, function(widgetinfo) {
		// 可以根据manifest.json里的应用名称来进行针对性的APP升级
		if (widgetinfo.name == 'xxxx') { //APP名称
			uni.request({
				url: 'https://www.pgyer.com/apiv2/app/check', //检测App是否有更新
				data: {
					_api_key: '', //API 用户自己的Key
					appKey: '' //App应用的唯一Key
				},
				success: check => {
					console.log('check', check.data);
					if (check.statusCode == 200 && check.data.code == 0 && check.data.data) {
						console.log('1234');
						let data = check.data.data;
						console.log('data', data);
						let version = widgetinfo.version, //用户当前版本
							appVersion = data.buildVersion, //升级包版本
							appName = widgetinfo.name, //app名称
							// updata = data.apk_client_force_updata,//是否强制热更新
							appurl = data.downloadURL, //升级包地址
							intro = '发现新的《瑞金田长》APP,需要更新APP'; //升级包提示
						// wgt_version = data.wgt_version,//热更新版本号
						// wgt_download = data.wgt_download;//热更新地址
						//如果用户版本号小于升级包版本号,先升级
	
						if (data && version < appVersion) {
							uni.showModal({
								title: '更新提示',
								confirmText: '立即升级',
								content: intro,
								success: res => {
									if (res.confirm) {
										uni.showLoading({
											title: '正在更新',
											mask: true
										});
										uni.downloadFile({
											url: appurl,
											success: download => {
												if (download.statusCode == 200) {
													plus.runtime.install(
														download.tempFilePath,
														{
															force: false
														},
														() => {
															uni.hideLoading();
															plus.runtime.restart(); //更新成功启动
														},
														err => {
															//若没下载成功还是去下载
															uni.hideLoading();
															uni.showToast({
																title: '更新失败,将跳转下载页面',
																icon: 'none',
																duration: 2000
															});
														}
													);
													setTimeout(function() {
														plus.runtime.openURL(appurl);
													}, 2000);
												}
											}
										});
									} else if (res.cancel) {
										console.log('用户点击取消');
										uni.showToast({
											title: '版本无法继续使用瑞金田长APP,请先升级',
											icon: 'none',
											duration: 2000
										});
										//退出app
										setTimeout(function() {
											plus.runtime.quit();
										}, 2000);
									}
								},
								fail: () => {
									uni.hideLoading();
								}
							});
						} else {
							
						}
					}
				}
			});
		} else {
			//非安卓
		}
	});
}

二、后台提供接口(方案二) APP升级或热更新

1、获取manifest.json里的配置信息:plus.runtime.getProperty(plus.runtime.appid, function(widgetinfo) {})

2、通过接口获取更新内容

3、如果用户版本号小于升级包版本号,先升级。

4、如果用户版本号大于升级包但不等于热更新版本的情况下,去热更新

直接上代码:

<script>
export default {
	onLaunch: function() {
		console.log('App Launch');
	},
	onLoad() {
		// #ifdef APP-PLUS   //只有App才会执行 检查更新 方法
		uni.getSystemInfo({
			success: (res) => {
				var	that = this;
				//检测当前平台,如果是安卓则启动安卓更新  
				if (res.platform == "android") {
					that.checkUpdateApp();
				}
			}
		})
		// #endif
	},
	onShow: function() {
		
	},
	onHide: function() {
		
	},
	methods:{
		/* 检查更新 在线更新 */
		checkUpdateApp(){
			//  获取manifest.json里的配置信息
			plus.runtime.getProperty(plus.runtime.appid, function(widgetinfo) {
				// 可以根据manifest.json里的应用名称来进行针对性的APP升级
				if (widgetinfo.name == "xxxx") { //APP名称
					// 获取manifest.json里的版本号   
					uni.request({
						url:'',//服务器请求更新信息地址
						success:(srcData) => {
							console.log(srcData)
							let data = srcData.data;
							let version = widgetinfo.version,//用户当前版本
								appVersion = data.apk_client_version,//升级包版本
								appName = widgetinfo.name, //app名称
								updata = data.apk_client_force_updata,//是否强制热更新
								appurl = data.apk_client_download,//升级包地址
								intro = data.apk_client_intro,//升级包提示
								wgt_version = data.wgt_version,//热更新版本号
								wgt_download = data.wgt_download;//热更新地址
							
							//如果用户版本号小于升级包版本号,先升级	
							if(data && (version < appVersion)){
								uni.showModal({
									title:"更新提示",
									confirmText:"立即升级",
									content:intro,
									success: (src) => {
										if (res.confirm) {
											uni.showLoading({
												title:"正在更新",
												mask:true
											})
											uni.downloadFile({
												url:appurl,
												success: (download) => {
													if(download.statusCode == 200){
														plus.runtime.install(download.tempFilePath,{
															force:false
														},()=>{
															uni.hideLoading();
															plus.runtime.restart();//更新成功启动
														},(err)=>{//若没下载成功还是去下载
															uni.hideLoading();
															uni.showToast({
																title:"更新失败,将跳转下载页面",
																icon:"none",
																duration:2000
															})
														})
														setTimeout(function(){
															plus.runtime.openURL(appurl);
														},2000)
													}
												}
											})
										} else if (res.cancel) {
											console.log('用户点击取消');
                                            uni.showToast({
									            title:"版本无法继续使用瑞金田长APP,请先升级",
									            icon:"none",
									            duration:2000
								            })
								            //退出app
								            setTimeout(function(){
									                plus.runtime.quit();
								            },2000)
										}
									},
									fail: () => {
										uni.hideLoading();
									}
								})
							}else{
								
							}
							
							//如果用户版本号大于升级包但不等于热更新版本的情况下,去热更新
							if(data && (version >= appVersion) && (version != wgt_version)){
								uni.showLoading({
									title:"正在更新包,请稍后...",
									mask:true
								})
								uni.downloadFile({
									url:wgt_download,
									success: (wgtdow) => {
										if(wgtdow.statusCode == 200){
											plus.runtime.install(wgtdow.tempFilePath,{
												force:true
											},()=>{
												uni.hideLoading();
												plus.runtime.restart();//更新成功启动
											},(err)=>{//若没下载成功还是去下载
												uni.hideLoading();
												uni.showModal({
													content:"更新失败,请手动下载最新瑞金田长APP",
													success: (res) => {
														plus.runtime.openURL(wgt_download);
													}
												})
											})
											
										}
									}
								})
							}
						
						}
					})
				} else {
					//非安卓
				}
			});
			
		}
	},
};
</script>

猜你喜欢

转载自blog.csdn.net/qq_39891453/article/details/128035540