HTML5进阶 二 HBuilder实现软件自动升级

HBuilder实现软件自动升级

前言

移动APP开发好后需要实现软件自动升级功能,经过一番搜索,发现HBuilder具有“App资源在线升级更新”的功能,遂研究之。

经过一番测试,在源码思想的基础之上对其进行了优化。代码如下:

	var wgtVer = null;
	function plusReady(){
		// 获取本地应用资源版本号
		plus.runtime.getProperty(plus.runtime.appid,function(inf){
			wgtVer=inf.version;
			console.log("当前应用版本:" + wgtVer);
			console.log("=================版本测试=================");
		});
	}

	if(window.plus){
		plusReady();
	}else{
		document.addEventListener(‘plusready‘,plusReady,false);
		document.addEventListener(‘plusready‘,checkUpdate,false);
	}

	// 检测更新
	var checkUrl="http://www.weimingcloud.cn/lmapp/versionCheck.html";
	function checkUpdate(){
		plus.nativeUI.showWaiting("检测更新...");
/*		$ionicLoading.show({
			template: "检测更新..."
		});
		$timeout(function() {
			$ionicLoading.hide();
		}, 1200);*/
		var xhr = new XMLHttpRequest();
		xhr.onreadystatechange = function(){
			switch(xhr.readyState){
				case 4:
				plus.nativeUI.closeWaiting();
				if(xhr.status == 200){
					console.log("检测更新成功:" + xhr.responseText);
					// 读取最新版本号
					var newVer = xhr.responseText;
					console.log("最新版本:" + newVer);
					if(wgtVer && newVer && (wgtVer != newVer)){
						// H5 plus事件处理,弹出提示信息对话框
						plus.nativeUI.confirm("\"立马送药\"检测到新版本,是否更新?", function(e) {
							if(e.index == 0){
								console.log("确定!");
								downWgt(); // 下载升级包
							}
						}, "                  立马送药", ["确定", "取消"]);
					}else{
						plus.nativeUI.alert("无新版本可更新!");
					}
				}else{
					console.log("检测更新失败!");
					plus.nativeUI.alert("检测更新失败!");
				}
				break;
				default:
				break;
			}
		}
		xhr.open(‘GET‘,checkUrl);
		xhr.send();
	}

	// 下载wgt文件
	var wgtUrl = "http://www.weimingcloud.cn/lmapp/files/download/H5202FBD5.wgt";

	function downWgt(){
		plus.nativeUI.showWaiting("下载wgt文件...");

		plus.downloader.createDownload( wgtUrl, {filename:"_doc/update/"}, function(d,status){
			if ( status == 200 ) {
				console.log("下载wgt成功:"+d.filename);
				installWgt(d.filename);	// 安装wgt包
			} else {
				console.log("下载wgt失败!");
				plus.nativeUI.alert("下载wgt失败!");
			}
			plus.nativeUI.closeWaiting();
		}).start();
	}

	// 更新应用资源
	function installWgt(path){
		plus.nativeUI.showWaiting("安装wgt文件...");
		// force:false进行版本号校验,如果将要安装应用的版本号不高于现有应用的版本号则终止安装,并返回安装失败
		plus.runtime.install(path,{force:false},function(){
			plus.nativeUI.closeWaiting();
			console.log("安装wgt文件成功!");
			plus.nativeUI.alert("应用资源更新完成!",function(){
				plus.runtime.restart();
			});
		},function(e){
			plus.nativeUI.closeWaiting();
			console.log("安装wgt文件失败[" + e.code + "]:" + e.message);
			plus.nativeUI.alert("安装wgt文件失败[" + e.code + "]:" + e.message);
		});
	}	<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>

问题

注:确实在文件名上出问题,同一wgt文件名多次升级则出错提示了,即使提示"应用资源更新完成!" ,但版本号还是没更新的,因此同一wgt文件名只能使用一次, 这不知是哪里的bug.

果然是这个问题,更新包的名称不能重复,Android上第一次用了update.wgt。那么第二次就不能用这个名字了,得换一个名字,IOS是好的。

更新完成后,再次进入APP,发现版本号没变,还是原来的,接着有时更新....

遇到了上述问题,通过以上方法还是未能解决。难道这本身就是HBuilder的一个BUG?

检测更新更好的模式应该是客户端提交本地应用资源版本号到升级服务器,由升级服务器判断是否可更新并且返回App升级资源包下载地址,避免在客户端写资源下载地址;

更新时可以在后台静默下载,下次启动是直接更新,避免更新时打断用户操作。

使用官方Demo可以,怀疑是自己的wgt出错。

升级第一次成功,第二次也成功了!打成包试试.....1.0、2.0..格式可以。

版本更新时,需要做到wgt版本与versionCheck.html中的版本号一致。

有图有真相

         

优化

HTML5进阶(三)HBuilder实现软件自动升级(优化篇)

参考文献

1.http://ask.dcloud.net.cn/article/182

2.http://ask.dcloud.net.cn/question/12487

3.http://ask.dcloud.net.cn/question/11143

4.http://ask.dcloud.net.cn/article/282

5.http://ask.dcloud.net.cn/question/4088

6.http://www.dcloud.io/docs/api/zh_cn/runtime.shtml#plus.runtime.restart

7.http://ask.dcloud.net.cn/search/q-d2d0#all

8.http://www.html5plus.org/specification/Runtime.html

9.http://ionicons.com/

美文美图

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://www.cnblogs.com/captainbed

原文地址:https://www.cnblogs.com/shaoye007/p/10173140.html

时间: 2024-10-03 22:10:07

HTML5进阶 二 HBuilder实现软件自动升级的相关文章

c# 软件自动升级 程序自我关闭自己后重启

//指定一个文件名,写入脚本 string filename = Path.Combine(path,"killmyself.bat"); using (StreamWriter bat = new StreamWriter(filename, false, Encoding.GetEncoding("GB2312"))) { //删除指定程序,复制指定程序到指定路径 bat.WriteLine(string.Format(@" @echo off del

java CS结构软件自动升级的实现

前段时间做了一个工具发布给公司的各部门使用后反馈了不少BUG,每次修改后均需要发邮件通知各用户替换最新版本,很不方便,因此后来就写了一个自动升级的功能,这样每次发布新的版本时只需要将其部署到自动升级服务器上,工具使用用户运行工具时就会连接到自动升级服务器,检查是否有版本更新,如果有则完成更新后再运行最新版本,否则就运行当前工具版本. 为了使这个自动升级模块具有通用性,我将其做成可以单独运行的程序,而并非集成到工具中,这样则可以为各类软件提供自动升级的功能.自动升级模块采用SOCKET方式实现升级

实全软件产品自动升级管理解决方案

实全软件产品自动升级管理解决方案 目 录 1.    描述... 1 2.    产品管理后台系统... 1 2.1.     产品发布... 1 2.2.     产品下载... 2 2.3.     下载日志... 3 2.4.     异常日志... 3 3.    产品Web Service服务接口... 3 3.1.     接口说明... 4 4.    产品升级更新程序... 4 4.1.     产品升级自动更新工具... 5 4.2.     产品版本信息... 5 5.   

用C#实现C/S模式下软件自动在线升级

用C#实现C/S模式下软件自动在线升级 1 前言  长期以来,广大程序员为到底是使用Client/Server,还是使用Browser/Server结构争论不休,在这些争论当中,C/S结构的程序可维护性差,布置困难,升级不方便,维护成本高就是一个相当重要的因素.有很多企业用户就是因为这个原因而放弃使用C/S.然而当一个应用必须要使用C/S结构才能很好的实现其功能的时候,我们该如何解决客户端的部署与自动升级问题?部署很简单,只要点击安装程序即可,难的在于每当有新版本发布时,能够实现自动升级.现在好

Ionic实战 自动升级APP(Android版)

Ionic 框架介绍 Ionic是一个基于Angularjs.可以使用HTML5构建混合移动应用的用户界面框架,它自称为是"本地与HTML5的结合".该框架提供了很多基本的移动用户界面范例,例如像列表(lists).标签页栏(tab bars)和触发开关(toggle switches)这样的简单条目.它还提供了更加复杂的可视化布局示例,例如在下面显示内容的滑出式菜单. Ionic 自动升级APP一.准备工作 1.Cordova插件: cordova plugin add https:

Linux学习之CentOS(二十三)--Linux软件管理之源代码以及RPM软件包管理

在Linux系统下,对于软件包的管理有多种机制,有源代码方式.RPM软件包管理方式以及YUM软件管理方式,本篇随笔将详细讲解CentOS下源代码形式安装软件以及RPM软件包管理机制 一.源代码形式 首 先我们先来看一下源代码的方式.我们知道,在开源的环境下,大多数的开源软件都是以源代码的形式来发布,通常将源代码打包成tar.gz的归档压缩文件发 布到网上供我们下载使用.但是我们下载下来的源代码方式我们还不能够直接使用,不像在windows系统上直接下载下来可执行的二进制文件,我们需要将下 载好的

SNF开发平台WinForm之八-自动升级程序部署使用说明-SNF快速开发平台3.3-Spring.Net.Framework

9.1运行效果: 9.2开发实现: 1.首先配置服务器端,把“SNFAutoUpdate2.0\服务器端部署“目录按网站程序进行发布到IIS服务器上. 2.粘贴语句,生成程序 需要调用的应用程序的Load事件或者Program入口的Main方法第一行代码加上如下代码: 注意:是主程序的 Load事件要加上调整自动更新程序的代码.要以模式打开窗口.如果没有差异会自动关闭升级窗口显示主窗口. 3.把下面目录里的文件拷贝到 应用程序的同级目录下: 4.配置WINFORMS应用程序目录下Updateli

延缓或阻止Windows 10软件自动更新教程

Windows10强制自动更新机制从"诞生"之际就褒贬不一,强制更新之后从一定程度上提高了系统的安全性,然而它同时也会给用户带来许多不可预料的麻烦,比如说前一段时间的无限重启.那么我们能不能阻止软件自动更新呢?答案当然是肯定的.  如果你使用的是Win10专业版,可以通过设置来推迟升级,具体操作方法如下:  打开开始菜单,然后依次打开"设置"--"更新和安全",然后点击"高级选项",选择"推迟升级"即可. 

分布式进阶(二)Ubuntu 14.04下安装Dockr图文教程(一)

当前,完全硬件虚拟化技术(KVM.Xen.Hyper-V 等)能在一个物理主机上很好地运行多个互相独立的操作系统,但这也带来一些问题:性能不佳,资源浪费,系统反应迟缓等.有时候对用户来说,完全的硬件虚拟化并不是最好的选择. 一种替代方案是使用轻量级虚拟化技术 -- 所谓的 LinuX Container 容器 (LXC),它提供的是系统级虚拟化.与跑虚拟机相比,LXC 可以在一个轻量级沙箱容器里面跑多个 Linux 操作系统.当你需要设置一些易于克隆的开发环境.测试环境,或想在安全沙盒里安装应用