首先我们先来理清思路在来一步步的做 确保当前有h5puls的第三方库 或者使用HBuilder X 或者HBuilder 来打包webapp APK中就自动集成了h5puls(或者可以写道其他事件里面触发检查更新下载版本)

    h5puls官方文档
    1、先检查安装的apk的版本号,文档链接Runtime

    1. // 获取应用信息
    2. function getAppInfo() {
    3. plus.runtime.getProperty( plus.runtime.appid, function ( wgtinfo ) {
    4. //appid属性
    5. var wgtStr = "appid:"+wgtinfo.appid;
    6. //version属性
    7. wgtStr += "<br/>version:"+wgtinfo.version;
    8. //name属性
    9. wgtStr += "<br/>name:"+wgtinfo.name;
    10. //description属性
    11. wgtStr += "<br/>description:"+wgtinfo.description;
    12. //author属性
    13. wgtStr += "<br/>author:"+wgtinfo.author;
    14. //email属性
    15. wgtStr += "<br/>email:"+wgtinfo.email;
    16. //features 属性
    17. wgtStr += "<br/>features:"+wgtinfo.features;
    18. console.log( wgtStr );
    19. } );
    20. }
    21. //使用这个API 来获取APPID
    22. window.plus.runtime.getProperty(window.plus.runtime.appid,(inf)=>{
    23. console.log(inf) //当前APP的数据包含了APP的版本号
    24. console.log(inf.version) //当前APP的版本号
    25. })

    2、从服务端获取APP(服务端是我打包好的APP,以及对应的版本),获取服务端的数据 进行APP版本号的比较。
    使用Downloader模块进行APK下载 管理文件下载,用于从网络下载各种文件,可支持跨域访问操作,Downloader

    1. // 创建下载任务
    2. function createDownload() {
    3. var dtask = plus.downloader.createDownload("http://www.abc.com/a.doc", {}, function(d, status){
    4. // 下载完成
    5. if(status == 200){
    6. console.log("Download success: " + d.filename);
    7. } else {
    8. console.log("Download failed: " + status);
    9. }
    10. });
    11. //dtask.addEventListener("statechanged", onStateChanged, false);
    12. dtask.start();
    13. }

    这里我们新建一个自己的下载模块

    1. var downToaknew = window.plus.downloader.createDownload(‘APK下载地址’, {
    2. filename: '' //filename: (String 类型 )下载文件保存的路径
    3. },
    4. function (d, status) {
    5. if (status == 200) {
    6. // 当前下载的状态
    7. installApp(d.filename) // 调用安装的方法
    8. } else {
    9. window.plus.nativeUI.alert('下载失败')
    10. }
    11. }
    12. )
    13. downToaknew.start() //调用APP下载方法
    14. // app自动更新进度 下面放发会显示 当前APK下载进度 已经APK的大小
    15. downToaknew.addEventListener('statechanged', function ( task,status){
    16. }

    3、调用APP 安装模块 plus.runtime.install

    1. //APK下载的路基 前面我们设置了APK下载的路基 调用放发时候 传入路径即可
    2. function installApp (path) {
    3. window.plus.nativeUI.showWaiting('安装文件...')
    4. window.plus.runtime.install(
    5. path, {
    6. // true表示强制安装,不进行版本号的校验;false则需要版本号校验,如果将要安装应用的版本号不高于现有应用的版本号则终止安装,并返回安装失败。 仅安装wgt和wgtu时生效,默认值 false
    7. force: false
    8. },
    9. function () {
    10. window.plus.nativeUI.closeWaiting()
    11. console.log('安装文件成功!')
    12. _this.hidedownloader = false
    13. window.plus.nativeUI.alert('应用资源更新完成!', function () {
    14. window.plus.runtime.restart()
    15. })
    16. },
    17. function (e) {
    18. window.plus.nativeUI.closeWaiting()
    19. window.plus.nativeUI.alert('安装文件失败' + e.message)
    20. _this.hidedownloader = false
    21. sessionStorage.setItem('nextCheckTime', 'UnupdateId')
    22. }
    23. )
    24. }

    4、在APK下载完成后调用APK安装方法

    1. <template>
    2. <div id="app">
    3. <!-- PersonalCenter -->
    4. <router-view v-on:public_header="public_header" @toFather="getFlag" @toFatherDetail="getDetailFlag" />
    5. </div>
    6. </template>
    7. <script>
    8. export default {
    9. name: 'App',
    10. data () {
    11. return {
    12. versionInformation: []
    13. }
    14. },
    15. mounted () {
    16. this.examine()
    17. let _this = this
    18. document.addEventListener('plusready', function () {
    19. setTimeout(() => {
    20. // 获取当前的APP版本号
    21. window.plus.runtime.getProperty(window.plus.runtime.appid, function (inf) {
    22. console.log(inf)
    23. // 判断最新版本的版本号是否大于当前的版本
    24. if (_this.versionInformation[0].versionNumber > inf.version) {
    25. var downToaknew = window.plus.downloader.createDownload(
    26. _this.versionInformation[1].urldownloader +
    27. _this.versionInformation[0].downloadAddress, {
    28. filename: ''
    29. },
    30. function (d, status) {
    31. if (status == 200) {
    32. // 当前下载的状态
    33. installApp(d.filename) // 调用安装的方法
    34. } else {
    35. window.plus.nativeUI.alert('下载失败')
    36. }
    37. }
    38. )
    39. // 等于空代表,用户没有点击取消的任何操作
    40. let ThereIsAnew = confirm('发现新的版本啦,是否要更新')
    41. if (ThereIsAnew) {
    42. downToaknew.start() // 开启下载的任务
    43. // app自动更新进度
    44. downToaknew.addEventListener('statechanged', function (
    45. task,
    46. status
    47. ) {
    48. // 给下载任务设置一个监听 并根据状态 做操作
    49. switch (task.state) {
    50. case 1:
    51. console.log('正在下载')
    52. break
    53. case 2:
    54. console.log('已连接到服务器')
    55. break
    56. case 3:
    57. // console.log(task)
    58. // console.log(task.downloadedSize)//当前的大
    59. // console.log(task.totalSize)//安装包的大小
    60. }
    61. })
    62. // 自动更新
    63. // eslint-disable-next-line no-inner-declarations
    64. function installApp (path) {
    65. window.plus.nativeUI.showWaiting('安装文件...')
    66. window.plus.runtime.install(
    67. path, {
    68. // true表示强制安装,不进行版本号的校验;false则需要版本号校验,如果将要安装应用的版本号不高于现有应用的版本号则终止安装,并返回安装失败。 仅安装wgt和wgtu时生效,默认值 false
    69. force: false
    70. },
    71. function () {
    72. window.plus.nativeUI.closeWaiting()
    73. console.log('安装文件成功!')
    74. window.plus.nativeUI.alert('应用资源更新完成!', function () {
    75. window.plus.runtime.restart()
    76. })
    77. },
    78. function (e) {
    79. window.plus.nativeUI.closeWaiting()
    80. window.plus.nativeUI.alert('安装文件失败' + e.message)
    81. }
    82. )
    83. }
    84. } else {
    85. console.log('没有最新的版本')
    86. }
    87. }
    88. }, 3000)
    89. })
    90. })
    91. },
    92. methods: {
    93. // 检查当前版本是否是最新的
    94. examine: async function () {
    95. let params = {
    96. versionType: 1
    97. }
    98. const res = await this.http.post(this.api.examine, params)
    99. if (res.data.rc == 0) {
    100. this.versionInformation = this.versionInformation.concat(res.data.data)
    101. this.versionInformation.push({
    102. urldownloader: this.api.updateAPP
    103. })
    104. } else {
    105. // 获取最新版本失败
    106. }
    107. }
    108. }
    109. }
    110. </script>