首先我们先来理清思路在来一步步的做 确保当前有h5puls的第三方库 或者使用HBuilder X 或者HBuilder 来打包webapp APK中就自动集成了h5puls(或者可以写道其他事件里面触发检查更新下载版本)
h5puls官方文档
1、先检查安装的apk的版本号,文档链接Runtime
// 获取应用信息function getAppInfo() {plus.runtime.getProperty( plus.runtime.appid, function ( wgtinfo ) {//appid属性var wgtStr = "appid:"+wgtinfo.appid;//version属性wgtStr += "<br/>version:"+wgtinfo.version;//name属性wgtStr += "<br/>name:"+wgtinfo.name;//description属性wgtStr += "<br/>description:"+wgtinfo.description;//author属性wgtStr += "<br/>author:"+wgtinfo.author;//email属性wgtStr += "<br/>email:"+wgtinfo.email;//features 属性wgtStr += "<br/>features:"+wgtinfo.features;console.log( wgtStr );} );}//使用这个API 来获取APPIDwindow.plus.runtime.getProperty(window.plus.runtime.appid,(inf)=>{console.log(inf) //当前APP的数据包含了APP的版本号console.log(inf.version) //当前APP的版本号})
2、从服务端获取APP(服务端是我打包好的APP,以及对应的版本),获取服务端的数据 进行APP版本号的比较。
使用Downloader模块进行APK下载 管理文件下载,用于从网络下载各种文件,可支持跨域访问操作,Downloader
// 创建下载任务function createDownload() {var dtask = plus.downloader.createDownload("http://www.abc.com/a.doc", {}, function(d, status){// 下载完成if(status == 200){console.log("Download success: " + d.filename);} else {console.log("Download failed: " + status);}});//dtask.addEventListener("statechanged", onStateChanged, false);dtask.start();}
这里我们新建一个自己的下载模块
var downToaknew = window.plus.downloader.createDownload(‘APK下载地址’, {filename: '' //filename: (String 类型 )下载文件保存的路径},function (d, status) {if (status == 200) {// 当前下载的状态installApp(d.filename) // 调用安装的方法} else {window.plus.nativeUI.alert('下载失败')}})downToaknew.start() //调用APP下载方法// app自动更新进度 下面放发会显示 当前APK下载进度 已经APK的大小downToaknew.addEventListener('statechanged', function ( task,status){}
3、调用APP 安装模块 plus.runtime.install
//APK下载的路基 前面我们设置了APK下载的路基 调用放发时候 传入路径即可function installApp (path) {window.plus.nativeUI.showWaiting('安装文件...')window.plus.runtime.install(path, {// true表示强制安装,不进行版本号的校验;false则需要版本号校验,如果将要安装应用的版本号不高于现有应用的版本号则终止安装,并返回安装失败。 仅安装wgt和wgtu时生效,默认值 falseforce: false},function () {window.plus.nativeUI.closeWaiting()console.log('安装文件成功!')_this.hidedownloader = falsewindow.plus.nativeUI.alert('应用资源更新完成!', function () {window.plus.runtime.restart()})},function (e) {window.plus.nativeUI.closeWaiting()window.plus.nativeUI.alert('安装文件失败' + e.message)_this.hidedownloader = falsesessionStorage.setItem('nextCheckTime', 'UnupdateId')})}
4、在APK下载完成后调用APK安装方法
<template><div id="app"><!-- PersonalCenter --><router-view v-on:public_header="public_header" @toFather="getFlag" @toFatherDetail="getDetailFlag" /></div></template><script>export default {name: 'App',data () {return {versionInformation: []}},mounted () {this.examine()let _this = thisdocument.addEventListener('plusready', function () {setTimeout(() => {// 获取当前的APP版本号window.plus.runtime.getProperty(window.plus.runtime.appid, function (inf) {console.log(inf)// 判断最新版本的版本号是否大于当前的版本if (_this.versionInformation[0].versionNumber > inf.version) {var downToaknew = window.plus.downloader.createDownload(_this.versionInformation[1].urldownloader +_this.versionInformation[0].downloadAddress, {filename: ''},function (d, status) {if (status == 200) {// 当前下载的状态installApp(d.filename) // 调用安装的方法} else {window.plus.nativeUI.alert('下载失败')}})// 等于空代表,用户没有点击取消的任何操作let ThereIsAnew = confirm('发现新的版本啦,是否要更新')if (ThereIsAnew) {downToaknew.start() // 开启下载的任务// app自动更新进度downToaknew.addEventListener('statechanged', function (task,status) {// 给下载任务设置一个监听 并根据状态 做操作switch (task.state) {case 1:console.log('正在下载')breakcase 2:console.log('已连接到服务器')breakcase 3:// console.log(task)// console.log(task.downloadedSize)//当前的大// console.log(task.totalSize)//安装包的大小}})// 自动更新// eslint-disable-next-line no-inner-declarationsfunction installApp (path) {window.plus.nativeUI.showWaiting('安装文件...')window.plus.runtime.install(path, {// true表示强制安装,不进行版本号的校验;false则需要版本号校验,如果将要安装应用的版本号不高于现有应用的版本号则终止安装,并返回安装失败。 仅安装wgt和wgtu时生效,默认值 falseforce: false},function () {window.plus.nativeUI.closeWaiting()console.log('安装文件成功!')window.plus.nativeUI.alert('应用资源更新完成!', function () {window.plus.runtime.restart()})},function (e) {window.plus.nativeUI.closeWaiting()window.plus.nativeUI.alert('安装文件失败' + e.message)})}} else {console.log('没有最新的版本')}}}, 3000)})})},methods: {// 检查当前版本是否是最新的examine: async function () {let params = {versionType: 1}const res = await this.http.post(this.api.examine, params)if (res.data.rc == 0) {this.versionInformation = this.versionInformation.concat(res.data.data)this.versionInformation.push({urldownloader: this.api.updateAPP})} else {// 获取最新版本失败}}}}</script>
