HBuilder实现软件自动升级

前言

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

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

  1. var wgtVer = null;
  2. function plusReady(){
  3. // 获取本地应用资源版本号
  4. plus.runtime.getProperty(plus.runtime.appid,function(inf){
  5. wgtVer=inf.version;
  6. console.log("当前应用版本:" + wgtVer);
  7. console.log("=================版本测试=================");
  8. });
  9. }
  10.  
  11. if(window.plus){
  12. plusReady();
  13. }else{
  14. document.addEventListener('plusready',plusReady,false);
  15. document.addEventListener('plusready',checkUpdate,false);
  16. }
  17.  
  18. // 检测更新
  19. var checkUrl="http://www.weimingcloud.cn/lmapp/versionCheck.html";
  20. function checkUpdate(){
  21. plus.nativeUI.showWaiting("检测更新...");
  22. /* $ionicLoading.show({
  23. template: "检测更新..."
  24. });
  25. $timeout(function() {
  26. $ionicLoading.hide();
  27. }, 1200);*/
  28. var xhr = new XMLHttpRequest();
  29. xhr.onreadystatechange = function(){
  30. switch(xhr.readyState){
  31. case 4:
  32. plus.nativeUI.closeWaiting();
  33. if(xhr.status == 200){
  34. console.log("检测更新成功:" + xhr.responseText);
  35. // 读取最新版本号
  36. var newVer = xhr.responseText;
  37. console.log("最新版本:" + newVer);
  38. if(wgtVer && newVer && (wgtVer != newVer)){
  39. // H5 plus事件处理,弹出提示信息对话框
  40. plus.nativeUI.confirm("\"立马送药\"检测到新版本,是否更新?", function(e) {
  41. if(e.index == 0){
  42. console.log("确定!");
  43. downWgt(); // 下载升级包
  44. }
  45. }, " 立马送药", ["确定", "取消"]);
  46. }else{
  47. plus.nativeUI.alert("无新版本可更新!");
  48. }
  49. }else{
  50. console.log("检测更新失败!");
  51. plus.nativeUI.alert("检测更新失败!");
  52. }
  53. break;
  54. default:
  55. break;
  56. }
  57. }
  58. xhr.open('GET',checkUrl);
  59. xhr.send();
  60. }
  61.  
  62. // 下载wgt文件
  63. var wgtUrl = "http://www.weimingcloud.cn/lmapp/files/download/H5202FBD5.wgt";
  64.  
  65. function downWgt(){
  66. plus.nativeUI.showWaiting("下载wgt文件...");
  67.  
  68. plus.downloader.createDownload( wgtUrl, {filename:"_doc/update/"}, function(d,status){
  69. if ( status == 200 ) {
  70. console.log("下载wgt成功:"+d.filename);
  71. installWgt(d.filename); // 安装wgt包
  72. } else {
  73. console.log("下载wgt失败!");
  74. plus.nativeUI.alert("下载wgt失败!");
  75. }
  76. plus.nativeUI.closeWaiting();
  77. }).start();
  78. }
  79.  
  80. // 更新应用资源
  81. function installWgt(path){
  82. plus.nativeUI.showWaiting("安装wgt文件...");
  83. // force:false进行版本号校验,如果将要安装应用的版本号不高于现有应用的版本号则终止安装,并返回安装失败
  84. plus.runtime.install(path,{force:false},function(){
  85. plus.nativeUI.closeWaiting();
  86. console.log("安装wgt文件成功!");
  87. plus.nativeUI.alert("应用资源更新完成!",function(){
  88. plus.runtime.restart();
  89. });
  90. },function(e){
  91. plus.nativeUI.closeWaiting();
  92. console.log("安装wgt文件失败[" + e.code + "]:" + e.message);
  93. plus.nativeUI.alert("安装wgt文件失败[" + e.code + "]:" + e.message);
  94. });
  95. } <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. Go语言-通道类型

    通道(Channel)是Go语言中一种非常独特的数据结构.它可用于在不同Goroutine之间传递类型化的数据,并且是并发安全的.相比之下,我们之前介绍的那些数据类型都不是并发安全的.这一点需要特别注 ...

  2. jQuery 效果 – 停止动画

    jQuery stop() 方法用于在动画或效果完成前对它们进行停止. 点击这里,向上/向下滑动面板 实例 jQuery stop() 滑动 演示 jQuery stop() 方法. jQuery s ...

  3. Python File(文件) 方法

    file 对象使用 open 函数来创建,下表列出了 file 对象常用的函数: 序号 方法及描述 1 file.close() 关闭文件.关闭后文件不能再进行读写操作. 2 file.flush() ...

  4. 利用github webhook 结合openresty自动更新静态博客

    使用hexo在github pages上弄了一个静态博客,后来觉得访问有点慢,于是放到自己vps上. 对于静态博客的部署非常简单,本来就是html,js,css等静态文件,只要nginx上配置下目录就 ...

  5. Unity3D开发注意事项

    最近给组里定Unity开发注意事项,参考了@陆泽西在群里分享的[前端开发规范],结合自己工作中的经验,整理一下,下面不少条款都是我们要求在开发中必须遵守的. 资源: 图片统一为png格式,纹理属性:T ...

  6. 《An Industrial-Strength Audio Search Algorithm》译文

    随着微信摇一摇逐渐被大众所广泛使用,听歌识曲功能也开始被关注.目前来看,像音乐雷达和微信摇一摇都采用了经典的shazam算法,为了使大家对shazam算法更加了解,我将其经典论文进行了翻译,希望对大家 ...

  7. Dynamics CRM EXCEL导入数据字段类型为选项集时的注意事项

    在开始先展示下CRM的导入数据涉及选项集字段时的一个问题 下图是选项集字段的属性 下图是我要导入的excel中的列值,可以看出列明和字段名是一致的,而列值却不是选项集中已有的选项 在导入校验时,只要字 ...

  8. spark idea 的配置问题

    不知道下面的错误是为什么? Error:scalac: missing or invalid dependency detected while loading class file 'RDD.cla ...

  9. 随机采样和随机模拟:吉布斯采样Gibbs Sampling实现文档分类

    http://blog.csdn.net/pipisorry/article/details/51525308 吉布斯采样的实现问题 本文主要说明如何通过吉布斯采样进行文档分类(聚类),当然更复杂的实 ...

  10. String&StringBuilder&StringBuffer总结

    一.String的JVM内存分配测试与分析           String a="a"; String b="b"; String c="ab&qu ...