需求说明:使用MUI+Vue等技术并且通过HBuilderX打包开发移动app,在有版本更新时需要自动提示用户有新版本,并且可以点击下载自动安装。

思路说明:

  1. 应用打开时(使用Vue的生命周期mounted),获取自己的版本信息appinfo;
    (本身app的信息一般存放在mainfest.json中,直接获取即可)
mui.plusReady(function(){mui.getJSON("manifest.json", null, function(manifest){var version = data.versionvar vercode_local = version.code;var vername_local = version.name;console.log("版本名称:"+vername_local+",版本code:"+vercode_local);});
});
  1. 获取remote服务器上移动应用最新的版本信息(一般是存放一个json的数据信息)
mui.getJSON(【服务器的url + appInfo.version_json】, null, function(data) {var verCode = data.verCode;var verName = data.verName;//服务器版本//console.log("服务器版本名称:"+verName +",服务器版本code:"+verCode);
});
  1. 判断两个版本号是否相等,不相等则需要更新
if(vercode_local == verCode) {mui.toast("当前已经是最新版本!");} else {var btnArray = ['是', '否'];mui.confirm('当前版本是:' + vername_local + ',  最新版本是:' + verName + ',  是否立即更新?', '发现最新版本', btnArray, function(z) {if(z.index == 0) {console.log('确定');installApk(BASEINFO.maxsvc + appInfo.version_apk);} else {console.log('不确定');return;}});}

1.在vue的mounted生命周期进行更新校验

mounted() {mui.plusReady(function() {                    //console.log("检查更新!!!!");mui.init({statusBarBackground: '#EEEEEE'});plus.screen.lockOrientation("landscape-primary");if(mui.os.android) {mui.getJSON("../../manifest.json", null, function(data) {var version = data.versionvar vercode_local = version.code;var vername_local = version.name;//当前版本//console.log("版本名称:"+vername_local+",版本code:"+vercode_local);mui.getJSON(BASEINFO.maxsvc + appInfo.version_json, null, function(data) {var verCode = data.verCode;//服务器版本//console.log("服务器版本code:"+verCode);var verName = data.verName;if(vercode_local == verCode) {mui.toast("当前已经是最新版本!");} else {var btnArray = ['是', '否'];mui.confirm('当前版本是:' + vername_local + ',  最新版本是:' + verName + ',  是否立即更新?', '发现最新版本', btnArray, function(z) {if(z.index == 0) {console.log('确定');installApk(BASEINFO.maxsvc + appInfo.version_apk);} else {console.log('不确定');return;}});}});});}});
}

2.其中需要用到application.js中声明的函数

3.application.js中的函数

var BASEINFO={//接口urlmaxsvc:"http://*.*.*.*:port/appUpdate",  maxbiz:"http://*.*.*.*:port/maxbiz",download:"http://*.*.*.*:port/whatsup/releaseapk.jsp"
}function getWinWH() {var temp = {};var winWidth = "0";var winHeight = "0";if(window.innerWidth) {winWidth = window.innerWidth;} else if((document.body) && (document.body.clientWidth)) {winWidth = document.body.clientWidth;}if(window.innerHeight) {winHeight = window.innerHeight;} else if((document.body) && (document.body.clientHeight)) {winHeight = document.body.clientHeight;}if(document.documentElement && document.documentElement.clientHeight && document.documentElement.clientWidth) {winHeight = document.documentElement.clientHeight;winWidth = document.documentElement.clientWidth;}temp.winWidth = winWidth;temp.winHeight = winHeight;return temp;
}function getAppInfo(appname) {var prefix = "";var path = "";var name = "";//  MaxUAif(appname == "mua") {path = "com.maxnerva.maxua";prefix = "";name = path;}//   异常停线通知(L5)if(appname == "men") {path = "com.newpc.b2b.";prefix = "asm_";name = path + prefix + appname;}// E点名(L5)if(appname == "mrc") {path = "com.newpc.b2b.";prefix = "asm_";name = path + prefix + appname;}//    组装生产日报表(L5)if(appname == "pdr") {path = "com.newpc.b2b.";prefix = "asm_";name = path + prefix + appname;}//    仓库进料转仓(L6)if(appname == "mgr") {path = "com.foxconn.";prefix = "";name = path + prefix + appname;}//   发料单查询(L6)if(appname == "mgi") {path = "com.foxconn.max.activity";prefix = "";name = path;}// 仓库分批发料(L5)if(appname == "mso") {path = "com.newpc.b2b.";prefix = "asm_";name = path + prefix + appname;}// 上料表查询(L6)if(appname == "mgf") {path = "com.newpc.b2b.";prefix = "asm_";name = path + prefix + appname;}//  IQC进料检验(L6)if(appname == "mqi") {path = "com.foxconn.iqc";prefix = "";name = path;}//    流程卡(L5)if(appname == "wfc") {path = "com.mts.";prefix = "";name = path + prefix + appname;}//  mqi_vif(appname == "mqi_v") {path = "com.foxconn.";prefix = "";name = path + prefix + appname;}var appInfo = {};appInfo.scheme = "open";appInfo.host = name;appInfo.package = name;appInfo.version_json = "/resource/download/" + appname + ".json";appInfo.version_apk = "/resource/download/" + appname + ".apk";appInfo.version_desc = "/resource/download/" + appname + ".desc";return appInfo;
}function installApk(url) {var dtask = plus.downloader.createDownload(url, {}, function(d, status) {if(status == 200) {plus.nativeUI.toast("正在准备环境,请稍后!");sleep(1000);var path = d.filename;console.log(d.filename);plus.runtime.install(path);} else {alert('Download failed:' + status);}});dtask.start();
}function sleep(numberMillis) {var now = new Date();var exitTime = now.getTime() + numberMillis;while(true) {now = new Date();if(now.getTime() > exitTime)return;}
}function getAppVersion(packagename) {var versionJson = {};var main = plus.android.runtimeMainActivity();var pm = main.getPackageManager();var PackageManager = plus.android.importClass(pm);var pi = pm.getPackageInfo(packagename, 0);var PackageInfo = plus.android.importClass(pi);var vercode_local = plus.android.getAttribute(pi, "versionCode");var vername_local = plus.android.getAttribute(pi, "versionName");versionJson.vercode_local = vercode_local;versionJson.vername_local = vername_local;return versionJson;
}function jumpAndroid(appname) {var appInfo = getAppInfo(appname);//console.log("appInfo  "+appInfo);var url = appInfo.scheme + "://" + appInfo.host +"?BUNDLE_CAMP=" + localStorage.getItem("musercamp") +"&BUNDLE_USERNAME=" + localStorage.getItem("musername") +"&BUNDLE_USERPASSWRD=" + localStorage.getItem("mpassword");//console.log("appInfo  "+appInfo); try {if(plus.os.name == "Android") {if(plus.runtime.isApplicationExist({pname: appInfo.host,action: appInfo.scheme + '://'})) {var versionJosn = getAppVersion(appInfo.package);var vercode_local = versionJosn.vercode_local;var vername_local = versionJosn.vername_local;mui.getJSON(BASEINFO.maxsvc + appInfo.version_json, null, function(data) {var verCode = data.verCode;var verName = data.verName;if(vercode_local == verCode) {location.href = url;} else {var btnArray = ['是', '否'];mui.confirm('当前版本是:' + vername_local + ',  最新版本是:' + verName + ',  是否立即更新?', '发现最新版本', btnArray, function(z) {if(z.index == 0) {installApk(BASEINFO.maxsvc + appInfo.version_apk);} else {location.href = url;}});}});} else {var btnArray = ['是', '否'];mui.confirm('应用程式未安装,  是否立即安装?', '应用程式安装确认', btnArray, function(z) {if(z.index == 0) {installApk(BASEINFO.maxsvc + appInfo.version_apk);} else {return;}});}}} catch(e) {mui.toast("更新失败  "+e.toString());}
}function myAjax(url, type, input, timeout, success, error) {var xhr = new plus.net.XMLHttpRequest();if(timeout && timeout > 0) xhr.timeout = timeout;xhr.onreadystatechange = function() {switch(xhr.readyState) {case 0:console.log("xhr请求已初始化");break;case 1:console.log("xhr请求已打开");break;case 2:console.log("xhr请求已发送");break;case 3:console.log("xhr请求已响应");break;case 4:if(xhr.status == 200) {success(eval('('+xhr.responseText + ')'));} else {error(xhr.readyState, xhr);}break;default:break;}}if(input) {if(type == 'post' || type == 'get') {xhr.open(type || "GET", url);xhr.send(JSON.stringify(input));} else {throw new Error("type is undefined !")}} else {if(type != 'post' && type != 'get') {throw new Error("type is undefined !")}xhr.open(type || "GET", url);xhr.send();}
}function isSysAdmin(groups) {var result = false;for(var i = 0; i < groups.length; i++) {var group = groups[i];if(group.groupcode.toUpperCase() == "SYSADMIN") {result = true;break;}}return result;
}function isReadonly() {var result = false;var muserStr=localStorage.getItem("muser");var muserObj=eval('(' + muserStr + ')');var groups=muserObj.group;if(groups && groups.length>0 && groups[0].groupcode.toUpperCase().indexOf("_READ")>0) result = true;return result;
}function getLongUsername(){var muserStr=localStorage.getItem("muser");var muserObj=eval('(' + muserStr + ')');var muser=muserObj.user;return muser.username+"("+muser.lastname+")";
}//其他方法检查版本
function svn(t) {   var xhr_svn = new plus.net.XMLHttpRequest();   xhr_svn.onreadystatechange = function() {   if (xhr_svn.readyState == 4) {   if (xhr_svn.status == 200) {   var res = JSON.parse(xhr_svn.responseText);   if (res.state == 'yes') {   if (res.mark != t) {   var upr;   plus.nativeUI.confirm( "有新版本发布了,是否件更新?", function(e){   upr=(e.index==0)?"Y":"N";   console.log(upr);   if(upr=="Y"){   var wt = plus.nativeUI.showWaiting('下载更新中,请勿关闭');   var url = res.url; // 下载文件地址   var dtask = plus.downloader.createDownload(url, {}, function(d, status) {   if (status == 200) { // 下载成功   var path = d.filename;   console.log(d.filename);   plus.runtime.install(path);   } else { //下载失败   alert("Download failed: " + status);   }   });   dtask.start();   }else{   }   }, "XXX系统", ["确认","取消"] );   } else {   console.log('最新');   }   }   } else {   plus.nativeUI.toast( "网络连接错误!");   }   }   }   xhr_svn.open("GET", "http:/XXX/APPobject/imes/update.json");//这里的地址是上面json文件的地址   xhr_svn.send();
}

4.服务器端添加配置信息

1.主要添加json(新版本信息),apk(新版本安装包),desc(描述文件)

HBuilderX开发app实现自动更新版本相关推荐

  1. hbuilderx版本怎么更新到新版本_HBuilderX开发app实现自动更新版本

    需求说明:使用MUI+Vue等技术并且通过HBuilderX打包开发移动app,在有版本更新时需要自动提示用户有新版本,并且可以点击下载自动安装. 思路说明: 应用打开时(使用Vue的生命周期moun ...

  2. 前端MUI+H5+HBuilderX开发APP(IOS,android),后台Springboot,java学习与实践文章,更新中(二)

    前端MUI+H5+HBuilderX开发APP(IOS,android),后台Springboot,项目搭建,图标设置等,更新中(二) 新建我的第一个APP manifest.json: 图标设置: ...

  3. 如何实现已发布app的自动更新

    要实现app的自动更新,做两件事情就可以搞定 1.获取当前手机中的app版本号 我们可以通过查询mainbundle中的获取CFBundleVersion NSDictionary *infoDict ...

  4. uniapp打包安卓APP实现自动更新(更新app)

    先列出需要注意的地方,避免新手朋友们出错 如果uniapp运行app报错:ReferenceError: plus is not defined ,普通浏览器里没有plus环境,只有HBuilder真 ...

  5. electron自动更新版本electron-updater

    首先来看效果图: 打包electron生成新的exe安装包:npm run dist 使用simplehttpserver开启存放打包好的exe安装包与yml文件的本地服务(打包目录里有这两个文件) ...

  6. 微信小程序自动更新版本

    PS: 小程序发布版本后正常老用户是不能直接看到的新版本的, 需要通过:删除小程序浏览记录.从我的小程序中移除.退出微信账号重新登录这些办法才能看到新版本内容 这是因为小程序有静默更新机制: 未启动时 ...

  7. iOS企业版使用第三方实现自动更新版本

    1.获取本地版本和互联网版本          NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];     N ...

  8. 【CF 应用开发大赛】自动更新系统服务端

    2019独角兽企业重金招聘Python工程师标准>>> 应用名称:自动更新系统服务端 应用URL地址:http://tt32-2.cloudfoundry.com/ 应用说明及使用场 ...

  9. uni-app开发APP实现热更新和整包更新

    热更新(.wgt):只有前端资源或模块进行调整,整个App结构不发生变化,那只需要更新这一部分资源,避免用户重新下载整个App.通过 HBuilderX 打包 .wgt 包即可 整包更新(.apk): ...

最新文章

  1. JavaScript 中 Object ,Prototype 相关的属性和方法
  2. matlab GUI 实现按钮切换plot页面(含clear功能)
  3. PAT (Advanced Level) Practise 1004 解题报告
  4. day28 socketserver
  5. MySQL优化的一些基础
  6. 2 万字长文盘点五种负载均衡策略
  7. SAP MM 用客户寄售库存管理方式来管理周转箱等可回收物料
  8. 华为路由器显示连接到服务器失败怎么办,华为路由器设置好后不能上网怎么办...
  9. Oracle 数据库访问故障(TNS-12535、TNS-00505)解决思路
  10. C# Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).
  11. Android脑图--Android动画
  12. Office-页码全为0的原因及解决方法
  13. C语言内联汇编使用方法
  14. Beego框架logs模块
  15. 表结构设计器EZDML常见问题(2019年11月整理)
  16. Android学习网站(1)
  17. MemSQL、SQLFire、Oracle XE性能对比测试
  18. 免费的地理位置信息geo-ip数据库maxmind
  19. 投身自媒体的普通人:他们是如何从从月入30到月入3万的
  20. B. Game on Ranges

热门文章

  1. 高效编写简历项目经验,备受500强HR推荐的STAR法则
  2. 十九个常用Linux命令,有趣又好玩!
  3. 如何将一个项目在自己的服务器上跑起来
  4. 云瞻外卖江湖外卖满天星外卖美赚外卖CPS系统小程序软件源码开发
  5. 如何通过视频号变现300万,聊聊IP的定位、产品和变现
  6. IBM Webshere MQ 队列配置
  7. 飞智八爪鱼2/安卓模拟器/PC/蓝牙手柄使用
  8. 高考0分作文精选--各行各业出人意料和情理之中
  9. C之(6)强弱符号引用
  10. java中字母、字符串,输入小写输出大写,输入大写输出小写、大小写转换