草庐IT

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

不加糖.. 2023-08-16 原文

思路:启动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>

有关uniapp - 实现安卓APP实时在线更新APP的更多相关文章

  1. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  2. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  3. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  4. ruby-on-rails - 每次我尝试部署时,我都会得到 - (gcloud.preview.app.deploy) 错误响应 : [4] DEADLINE_EXCEEDED - 2

    我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie

  5. ruby-on-rails - 如何重命名或移动 Rails 的 README_FOR_APP - 2

    当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?

  6. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  7. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  8. ruby - 使用 postgres.app 在 rvm 下要求 pg 时出错 - 2

    我正在使用Postgres.app在OSX(10.8.3)上。我已经修改了我的PATH,以便应用程序的bin文件夹位于所有其他文件夹之前。Rammy:~phrogz$whichpg_config/Applications/Postgres.app/Contents/MacOS/bin/pg_config我已经安装了rvm并且可以毫无错误地安装pggem,但是当我需要它时我得到一个错误:Rammy:~phrogz$gem-v1.8.25Rammy:~phrogz$geminstallpgFetching:pg-0.15.1.gem(100%)Buildingnativeextension

  9. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  10. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

随机推荐