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中的版本号一致。

有图有真相

         

优化

参考文献

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/

美文美图

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

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

    HBuilder实现软件自动升级(优化篇) 前言 受前篇博客<HTML5进阶(二)HBuilder实现软件自动升级>(点击查看详情)的影响,测试过程中发现APP自动更新还是存在问题,第一次 ...

  2. 在C#中实现软件自动升级

    在C#中实现软件自动升级 winform程序相对web程序而言,功能更强大,编程更方便,但软件更新却相当麻烦,要到客户端一台一台地升级,本文结合实际情况,通过软件实现自动升级,弥补了这一缺陷,有较好的 ...

  3. 在WinForm中使用Web Service来实现软件自动升级

    来源:互联网 winform程序相对web程序而言,功能更强大编程更方便,但软件更新却相当麻烦,要到客户端一台一台地升级,面对这个实际问题,在最近的一个小项目中,本人设计了一个通过软件实现自动升级技术 ...

  4. 在WinForm中使用Web Services 来实现 软件自动升级( Auto Update ) (C#)

    winform程序相对web程序而言,功能更强大,编程更方便,但软件更新却相当麻烦,要到客户端一台一台地升级,面对这个实际问题,在最近的一个小项目中,本人设计了一个通过软件实现自动升级技术方案,弥补了 ...

  5. 在WinForm中使用Web Services 来实现 软件 自动升级( Auto Update ) (C#)

    winform程序相对web程序而言,功能更强大,编程更方便,但软件更新却相当麻烦,要到客户端一台一台地升级,面对这个实际问题,在最近的一个小项目中,本人设计了一个通过软件实现自动升级技术方案,弥补了 ...

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

    前段时间做了一个工具发布给公司的各部门使用后反馈了不少BUG,每次修改后均需要发邮件通知各用户替换最新版本,很不方便,因此后来就写了一个自动升级的功能,这样每次发布新的版本时只需要将其部署到自动升级服 ...

  7. c# 基于FTP协议的简易软件自动升级程序

    最近在重写了一个老的产品条码扫描程序,客户端数越有30个,因为经常有更新,C/S维护非常不方便,所以做一个自动更新程序特别有必要. 在网上随便找了找自动更新的方案,大多使用VS的发布/更新功能,不太喜 ...

  8. hbuilder 开发app 自动升级

    使用huilder 开发app  ,实现app升级功能 1. var wgtVer = null; //用于获取系统当前版本 var currentversion = null; //用于获取系统最新 ...

  9. C/S软件的自动升级部署

    升级的原理有好几个,首先无非是将现有版本与最新版本作比较,发现最新的则提示用户是否升级.当然也有人用其它属性比较的,例如:文件大小,或者更新日期.而实现的方法呢? 在.Net时代,我们就有了更多的选择 ...

随机推荐

  1. Gradle 1.12用户指南翻译——第四十七章. Build Init 插件

    本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  2. 安卓高级3 RecyclerView结合SwipeRefreshLayout并添加上拉

    目录结构: 效果图: MainActivity.java package qianfeng.com.pullrecyclerviewdemo; import android.os.Bundle; im ...

  3. RxJava(十)switchIfEmpty操作符实现Android检查本地缓存逻辑判断

    欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/52585912 本文出自:[余志强的博客] switchIfEmpty ...

  4. 浅析深度学习mini_batch的BP反传算法

    在深度学习中,如果我们已经定义了网络,输入,以及输出,那么接下来就是损失函数,优化策略,以及一般由框架完成的BP反传.这篇博文我们主要探讨一下深度的BP反传算法(以梯度下降为例),尤其是mini_ba ...

  5. Redis源码剖析--源码结构解析

    请持续关注我的个人博客:https://zcheng.ren 找工作那会儿,看了黄建宏老师的<Redis设计与实现>,对redis的部分实现有了一个简明的认识.在面试过程中,redis确实 ...

  6. PHP + JavaScript + Ajax 实现无刷新页面加载效果

    数据源工厂 Json生成方式1 Json生成方式2 数据搬运工 数据加工师 转换类型 加工展示 结果展示 初始页面 点击按钮之后 总结 今天这个实验的思路就是实现一个无刷新的页面加载效果.具体的思路是 ...

  7. Android事件分发传递回传机制详解

    转载本专栏每一篇博客请注明转载出处地址,尊重原创.此博客转载链接地址:点击打开链接   http://blog.csdn.net/qq_32059827/article/details/5257701 ...

  8. 使用Contacts Contract Content Provider操作通讯录最佳实践

    Android向所有被赋予READ_CONTACTS权限的应用程序提供了联系人信息数据库的完全访问权限.Contacts Contract使用3层数据模型去存储数据,下面介绍Contacts Cont ...

  9. 谷歌面试题:输入是两个整数数组,他们任意两个数的和又可以组成一个数组,求这个和中前k个数怎么做?

    谷歌面试题:输入是两个整数数组,他们任意两个数的和又可以组成一个数组,求这个和中前k个数怎么做? 分析: "假设两个整数数组为A和B,各有N个元素,任意两个数的和组成的数组C有N^2个元素. ...

  10. Dynamics CRM2015 Update1 新功能之表单增强功能

    CRM2015 Update 1发布后,系统的界面的变化很大,仔细观察后会发现表单窗体也有些不同了,在CRM2015 Update1的官方介绍中对此变化的解释是起用了新的窗体呈现引擎,让界面更好看加载 ...