web app升級—帶進度條的App自動更新

来源:https://www.cnblogs.com/jiekzou/archive/2019/09/18/11544116.html
-Advertisement-
Play Games

帶進度條的App自動更新,效果如下圖所示: 技術:vue、vant-ui、5+ 封裝獨立組件AppProgress.vue: app升級代碼,封裝獨立js文件:appUpdateOptions.js 調用代碼: 結束....... ...


  帶進度條的App自動更新,效果如下圖所示:

    技術:vue、vant-ui、5+

  封裝獨立組件AppProgress.vue:

<template>
  <div>
    <van-dialog v-model="show" confirm-button-text="後臺下載" class="app-update">
      <img src="../../assets/imgs/progress-bar.png" />
      <van-progress :percentage="percentageVal" />
      <div class="msg">版本更新中,請稍後...</div>
    </van-dialog>
  </div>
</template>

<script>
// app下載進度組件
export default {
  props: {
    // 進度值
    percentageVal: {
      type: Number,
      default: 0
    },
    // 是否顯示彈窗
    show: {
      type: Boolean,
      default: false
    }
  },
  data() {
    return {}
  }
}
</script>

<style lang="scss" scoped>
img {
  width: 270px;
  height: 163px;
  position: fixed;
  top: -35px;
  z-index: 2200;
}
</style>
<style lang="scss">
.app-update.van-dialog {
  overflow: visible;
  width: 270px;
  border-radius: 12px;
  .van-progress {
    margin-top: 124px;
    z-index: 2300;
  }
  .msg {
    font-size: 16px;
    font-weight: 600;
    color: white;
    position: absolute;
    top: 50px;
    z-index: 2300;
    width: 100%;
    text-align: center;
  }
  .van-dialog__footer {
    border-radius: 12px;
    .van-button--default {
      .van-button__text {
        width: 105px;
        height: 26px;
        border-radius: 13px;
        background-color: #006eff;
        color: white;
        font-weight: 600;
        font-size: 12px;
        display: inline-block;
        margin-top: 10px;
        line-height: 26px;
      }
    }
  }
}
</style>

app升級代碼,封裝獨立js文件:appUpdateOptions.js

/**
 * IOS 包發佈到應用市場後要更新此處的ID,替換掉測試ID:1053012308
 */
/* eslint-disable no-undef */
import { getVersion } from '@/services/login';
import request from '../../api/ajax.js';
import { Dialog } from 'vant';
import expiredStorage from '@/utils/expiredStorage.js';

function sleep(numberMillis) {
  var now = new Date();
  var exitTime = now.getTime() + numberMillis;
  while (true) {
    now = new Date();
    if (now.getTime() > exitTime) return;
  }
}

// Vue繼承的基礎對象
export default {
  data() {
    return {
      show: false,
      percentageVal: 0
    };
  },
  methods: {
    appUpdate(ismanual) {
      const that = this;
      console.log('appUpdate');
      // 獲取5+運行環境的版本號
      console.log('5+ Runtime version:' + plus.runtime.innerVersion);
      plus.runtime.getProperty(plus.runtime.appid, function(inf) {
        const ver = inf.version;
        console.log('ver:' + ver);
        var ua = navigator.userAgent.toLowerCase();
        // 蘋果手機
        if (/iphone|ipad|ipod/.test(ua)) {
          // 獲取當前上架APPStore版本信息
          request
            .get('https://itunes.apple.com/lookup?id=1053012308', {
              id: 1053012308 // APP唯一標識ID
            })
            .then(data => {
              console.log('data:' + JSON.stringify(data));
              var resultCount = data.resultCount;
              for (var i = 0; i < resultCount; i++) {
                var normItem = data.results[i].version;
                console.log('normItem:' + normItem);
                if (normItem > ver) {
                  var _msg = '發現新版本:V' + normItem;
                  // plus.nativeUI.alert("發現新版本:V" + normItem);
                  Dialog.confirm({
                    title: '升級確認',
                    message: _msg
                  })
                    .then(() => {
                      // on confirm
                      // 執行升級操作
                      document.location.href =
                        'https://itunes.apple.com/cn/app/id1053012308?mt=8'; // 上新APPStore下載地址
                    })
                    .catch(() => {
                      // on cancel
                      expiredStorage.setItem('$upgradeTip', false, 1 / 12); // 1/12天內不再顯示升級提示
                    });
                  return;
                }
              }
              if (ismanual) {
                plus.nativeUI.toast('當前版本號已是最新');
              }
            });
        } else if (/android/.test(ua)) {
          getVersion().then(res => {
            console.log('data:' + JSON.stringify(res));
            if ((res.code = 200 && res.data.version > ver)) {
              var _msg = '發現新版本:V' + res.data.version;
              const apkUrl = res.data.redirectUrl;
              Dialog.confirm({
                title: '升級確認',
                message: _msg
              })
                .then(() => {
                  // on confirm
                  // 執行升級操作
                  console.log('apkUrl :', apkUrl);
                  // plus.nativeUI.toast('正在準備環境,請稍後!');
                  that.show = true;
                  var dtask = plus.downloader.createDownload(
                    apkUrl,
                    {},
                    function(d, status) {
                      if (status == 200) {
                        // sleep(1000);
                        var path = d.filename; // 下載apk
                        plus.runtime.install(path); // 自動安裝apk文件
                        that.show = false;
                      } else {
                        plus.nativeUI.alert('版本更新失敗:' + status);
                        that.show = false;
                      }
                    }
                  );
                  try {
                    dtask.start(); // 開啟下載的任務
                    var prg = 0;
                    // var showLoading = plus.nativeUI.showWaiting(
                    //   '版本更新中,請稍後!'
                    // ); // 創建一個showWaiting對象
                    dtask.addEventListener('statechanged', function(
                      task,
                      status
                    ) {
                      // 給下載任務設置一個監聽 並根據狀態  做操作
                      switch (task.state) {
                        case 1:
                          // showLoading.setTitle('正在下載');
                          break;
                        case 2:
                          // showLoading.setTitle('已連接到伺服器');
                          break;
                        case 3:
                          prg = parseInt(
                            (parseFloat(task.downloadedSize) /
                              parseFloat(task.totalSize)) *
                              100
                          );
                          that.percentageVal = prg;
                          break;
                        case 4:
                          that.show = false;
                          break;
                      }
                    });
                  } catch (err) {
                    that.show = false;
                    if (ismanual) {
                      plus.nativeUI.toast('網路異常,請稍候再試' + err);
                    }
                  }
                })
                .catch(error => {
                  // on cancel
                  console.log('error :', error);
                  that.show = false;
                  expiredStorage.setItem('$upgradeTip', false, 1 / 12); // 1/12天內不再顯示升級提示
                });
            } else {
              console.log('當前版本號已是最新');
              if (ismanual) {
                plus.nativeUI.toast('當前版本號已是最新');
              }
            }
          });
        }
      });
    }
  }
};

調用代碼:

import appUpdateOptions from '@/utils/mixins/appUpdateOptions.js'
import AppProgress from '@/components/common/AppProgress.vue';
export default {
  components: { AppProgress },
  props: {},
  mixins: [appUpdateOptions],
  methods: {
    // app更新
    appUpdateFuc() {
      const that = this;
      that.$mui.plusReady(function() {
        that.appUpdate(true);
      });
    },

結束.......


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、問題描述 初次安裝Android Studio,啟動後,報錯如下: 如圖: 二、原因分析 AS啟動後,會在預設路徑下檢測是否有Android SDK,如果沒有的話,就會報上述錯誤。 三、解決方案 3.1 主動設置SDK 如果本機有Android SDK的話,可以點擊cancel跳過,在下一個界面 ...
  • 目的: 圖片預載入能夠使得用戶在瀏覽後續頁面的時候,不會出現圖片載入一半導致瀏覽不流暢的情況。 一、方法一 項目打開的時候要對圖片進行預載入,在App.vue裡面的beforeCreate添加預載入程式 App.vue 二、方法二 創建兩個文件名稱分別為imgPreloader.js以及imgPre ...
  • 0918自我總結 JavaScript 三種彈窗方式 一.alert 用法: 二.confirm 用法: 三.prompt ...
  • 博客園美化夜間模式 一.點擊控制樣式 一.觸發點擊 二.修改按鈕樣式以及對於類名 三.將模式信息存入sessionStorage中 四.更具按鈕的類名,自己博客樣式進行跟換 二.時間控制切換 考慮情況: 1.時間到了提醒是不是要切換 2.已經是夜間模式了就用切換 3.有些人不喜歡這些提示 這段代碼解 ...
  • <script> // 使用索引位置來訪問字元串中的每個字元: var carname = 'Volvo XC60'; var character = carname[7]; console.log(character)</script><script> // 可以在字元串中使用引號,字元串中的引號 ...
  • 在使用javascript實現基本的數據結構中,練習了好幾周,對基本的數據結構如 棧、隊列、鏈表、集合、哈希表、樹、圖等內容進行了總結並且寫了筆記和代碼。 在 github中可以看到 點擊查看,可以關註一下我哈。 樹的基本術語 二叉樹節點的存儲結構 創建一個二叉搜索樹 二叉樹的先序、中序、後續遍歷算 ...
  • vue 微信頁面添加水印 this.$nextTick(function() { watermark({ watermark_txt: "<div>" + '123' + "</div><div>" + '456' + "</div>"}); }) function watermark(settin ...
  • 昨天讓我做一個功能,實現一個模糊檢索,我就想,那做唄,然後開始正常的開發 代碼如下: HTML VUE 因為是實時的,所以寫了將邏輯寫到了watch中 五分鐘搞定。 我以為這就完了,然而產品的需求是無窮無盡的,敬愛的(我想說啥你懂得)產品經理,看到我做的這麼快果斷加了一波需求。 產品:我覺得你這裡可 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...