Kaynağa Gözat

app自动检测更新

yangzj 2 yıl önce
ebeveyn
işleme
bb00875d0d

+ 14 - 18
App.vue

@@ -3,7 +3,8 @@ import { config } from '@/common/config.js';
 export default {
 	data() {
 		return {
-			downloadUrl: ''
+			downloadUrl: '',
+			version: ''
 		};
 	},
 	onLaunch: function() {
@@ -25,32 +26,21 @@ export default {
 				})
 				.then(res => {
 					if (res.code === 200) {
+						this.version = res.msg
 						if (res.msg !== config.version) {
 							uni.getNetworkType({
 								success: function(res) {
 									if (res.networkType === 'wifi') {
-										uni.showModal({
-											title: '版本发布更新',
-											content: '发现新版本且您使用的是无限网络,是否进行更新?',
-											confirmText: '更新',
-											confirmColor: '#EE8F57',
-											success: res => {
-												if (res.confirm) {
-													// _this.downloadAppFile()
-													_this.downloadAppFileByBrowser();
-												}
-											}
-										});
+										_this.downloadAppFileByBackstage()
 									} else {
 										uni.showModal({
-											title: '版本发布更新',
-											content: '发现新版本,是否继续消耗流量进行更新?',
+											title: '提示',
+											content: '当前网络非WIFI,继续更新可能会产生流量,确认要更新吗?',
 											confirmText: '更新',
 											confirmColor: '#EE8F57',
 											success: res => {
 												if (res.confirm) {
-													// _this.downloadAppFile()
-													_this.downloadAppFileByBrowser();
+													_this.downloadAppFileByBackstage()
 												}
 											}
 										});
@@ -128,7 +118,13 @@ export default {
 		 * 下载app通过后台任务栏
 		 */
 		downloadAppFileByBackstage() {
-			
+			uni.$u.route({
+				url: 'pages/appUpdate/appUpdate',
+				params: {
+					downloadUrl: this.downloadUrl,
+					version: this.version
+				}
+			})
 		},
 		/**
 		 * 下载app通过浏览器

+ 1 - 1
common/config.js

@@ -4,5 +4,5 @@ if (process.env.NODE_ENV === 'development') {
 }
 export const config = {
 	baseUrl,
-	version: '0.3.4'
+	version: '0.1.1'
 }

+ 12 - 9
manifest.json

@@ -26,22 +26,25 @@
             /* android打包配置 */
             "android" : {
                 "permissions" : [
-                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
-                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
-                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
-                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
-                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera\"/>",
                     "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
                     "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
                     "<uses-permission android:name=\"android.permission.CAMERA\"/>",
+                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
                     "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
+                    "<uses-permission android:name=\"android.permission.INSTALL_PACKAGES\"/>",
+                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
                     "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
-                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.REQUEST_INSTALL_PACKAGES\"/>",
+                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
                     "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
-                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
-                    "<uses-feature android:name=\"android.hardware.camera\"/>",
                     "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
-                ]
+                ],
+                "autoSdkPermissions" : false
             },
             /* ios打包配置 */
             "ios" : {

+ 8 - 0
pages.json

@@ -212,6 +212,14 @@
         "navigationBarBackgroundColor": "#1767F2",
         "navigationBarTextStyle": "white"
       }
+    },
+    {
+      "path": "pages/appUpdate/appUpdate",
+      "style": {
+        "navigationBarTitleText": "应用更新",
+        "enablePullDownRefresh": false,
+				"navigationStyle": "custom"
+      }
     }
   ],
   "globalStyle": {

+ 341 - 0
pages/appUpdate/appUpdate.vue

@@ -0,0 +1,341 @@
+<template>
+  <view class="page-height">
+    <view class="page-content">
+      <view class="wrap" v-if="popup_show">
+        <view class="popup-bg">
+          <view class="popup-content" :class="{ 'popup-content-show': popup_show }">
+            <view class="update-wrap">
+              <image src="/static/images/img.png" class="top-img"></image>
+              <view class="content">
+                <text class="title">发现新版本V{{ updateInfo.version }}</text>
+                <!-- 升级描述 -->
+                <view class="title-sub" v-html="updateInfo.note"></view>
+                <!-- 操作按钮 -->
+                <view class="operation-btn" v-if="downstatus < 1">
+                  <button class="btn cancel" @click="cancel()">暂不升级</button>
+                  <button class="btn" @click="onUpdate()">立即升级</button>
+                </view>
+                <!-- 下载进度 -->
+                <view class="sche-wrap" v-else>
+                  <!-- 更新包下载中 -->
+                  <view class="sche-bg">
+                    <view class="sche-bg-jindu" :style="lengthWidth"></view>
+                  </view>
+                  <text class="down-text">下载进度:{{ (downSize / 1024 / 1024).toFixed(2) }}M/{{ (fileSize / 1024 / 1024).toFixed(2) }}M</text>
+                </view>
+              </view>
+            </view>
+            <image src="/static/images/close.png" class="close-ioc" @click="closeUpdate()" v-if="downstatus < 1 && updateInfo.force == 0"></image>
+          </view>
+        </view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script>
+import { config } from '@/common/config.js';
+export default {
+  data() {
+    return {
+      popup_show: true,
+      updateInfo: {
+        note: '',
+        version: '',
+        downloadUrl: ''
+      }, //上一页面传过来的升级参数
+      note: [], //升级说明数组格式
+      fileSize: 0, //文件大小
+      downSize: 0, //已下载大小
+      downing: false, //是否下载中
+      downstatus: 0 //0未下载  1已开始 2已连接到资源  3已接收到数据  4下载完成
+    };
+  },
+  onLoad(option) {
+    this.updateInfo.version = option.version;
+    this.updateInfo.downloadUrl = option.downloadUrl;
+  },
+  onBackPress(e) {
+    if (e.from == 'backbutton') return true; //APP安卓物理返回键逻辑
+  },
+  computed: {
+    // 下载进度计算
+    lengthWidth: function () {
+      let w = (this.downSize / this.fileSize) * 100;
+      if (!w) {
+        w = 0;
+      } else {
+        w = w.toFixed(2);
+      }
+      return {
+        width: w + '%' //return 宽度半分比
+      };
+    },
+    getHeight: function () {
+      let bottom = 0;
+      if (this.tabbar) {
+        bottom = 50;
+      }
+      return {
+        bottom: bottom + 'px',
+        height: 'auto'
+      };
+    }
+  },
+  methods: {
+    // 当点击更新时
+    onUpdate() {
+      //判断是否为wifi模式
+      uni.getNetworkType({
+        success: (res) => {
+          if (res.networkType == 'wifi') {
+            this.startUpdate(); //开始更新
+          } else {
+            uni.showModal({
+              title: '提示',
+              content: '当前网络非WIFI,继续更新可能会产生流量,确认要更新吗?',
+              success: (modal_res) => {
+                if (modal_res.confirm) {
+                  this.startUpdate(); //开始更新
+                }
+              }
+            });
+          }
+        }
+      });
+    },
+    /**
+     * 取消升级
+     */
+    cancel() {
+      uni.$u.route({
+        type: 'back',
+        delta: 1
+      });
+    },
+    //开始更新
+    startUpdate() {
+      if (this.downing) return false; //如果正在下载就停止操作
+      this.downing = true; //状态改变 正在下载中
+      if (/\.wgt$/.test(this.updateInfo.downloadUrl)) {
+        // 如果是更新包
+        this.download_wgt(); // 安装包/升级包更新
+      } else {
+        plus.runtime.openURL(this.updateInfo.downloadUrl, function () {
+          //调用外部浏览器打开更新地址
+          plus.nativeUI.toast('打开错误');
+        });
+      }
+    },
+    // 下载升级资源包
+    download_wgt() {
+      plus.nativeUI.showWaiting('下载更新文件...'); //下载更新文件...
+      let options = {
+        method: 'get'
+      };
+      let dtask = plus.downloader.createDownload(this.updateInfo.downloadUrl, options);
+      dtask.addEventListener('statechanged', (task, status) => {
+        if (status === null) {
+        } else if (status == 200) {
+          //在这里打印会不停的执行,请注意,正式上线切记不要在这里打印东西!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+          this.downstatus = task.state;
+          switch (task.state) {
+            case 3: // 已接收到数据
+              plus.nativeUI.closeWaiting();
+              this.downSize = task.downloadedSize;
+              if (task.totalSize) {
+                this.fileSize = task.totalSize; //服务器须返回正确的content-length才会有长度
+              }
+              break;
+            case 4:
+              this.installWgt(task.filename); // 安装
+              break;
+          }
+        } else {
+          plus.nativeUI.closeWaiting();
+          plus.nativeUI.toast('下载出错');
+          this.downing = false;
+          this.downstatus = 0;
+        }
+      });
+      dtask.start();
+    },
+    // 安装文件
+    installWgt(path) {
+      plus.nativeUI.showWaiting('安装更新文件...'); //安装更新文件...
+      plus.runtime.install(
+        path,
+        {
+          force: true
+        },
+        function () {
+          plus.nativeUI.closeWaiting();
+          // 应用资源下载完成!
+          plus.nativeUI.alert('更新完成,请重启APP!', function () {
+            plus.runtime.restart(); //重启APP
+          });
+        },
+        function (e) {
+          plus.nativeUI.closeWaiting();
+          // 安装更新文件失败
+          plus.nativeUI.alert('安装更新文件失败[' + e.code + ']:' + e.message);
+        }
+      );
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.page-height {
+  height: 100vh;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+  background-color: rgba($color: #000000, $alpha: 0.7);
+}
+
+.popup-bg {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  position: fixed;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  width: 750rpx;
+}
+
+.popup-content {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+}
+
+.popup-content-show {
+  animation: mymove 300ms;
+  transform: scale(1);
+}
+
+@keyframes mymove {
+  0% {
+    transform: scale(0);
+    /*开始为原始大小*/
+  }
+
+  100% {
+    transform: scale(1);
+  }
+}
+
+.update-wrap {
+  width: 580rpx;
+  border-radius: 18rpx;
+  position: relative;
+  display: flex;
+  flex-direction: column;
+  background-color: #ffffff;
+  padding: 170rpx 30rpx 0;
+
+  .top-img {
+    position: absolute;
+    left: 0;
+    width: 100%;
+    height: 256rpx;
+    top: -128rpx;
+  }
+
+  .content {
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    padding-bottom: 40rpx;
+
+    .title {
+      font-size: 32rpx;
+      font-weight: bold;
+      color: #6526f3;
+    }
+
+    .title-sub {
+      text-align: center;
+      font-size: 24rpx;
+      color: #666666;
+      padding: 30rpx 0;
+    }
+    .operation-btn {
+      width: 100%;
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+    }
+    .btn {
+      width: 200rpx;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      color: #ffffff;
+      font-size: 30rpx;
+      height: 80rpx;
+      line-height: 80rpx;
+      border-radius: 100px;
+      background-color: #6526f3;
+      margin-top: 20rpx;
+    }
+		.cancel {
+			background-color: #cccccc;
+			color: #6526f3;
+		}
+  }
+}
+
+.close-ioc {
+  width: 70rpx;
+  height: 70rpx;
+  margin-top: 30rpx;
+}
+
+.sche-wrap {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: flex-end;
+  padding: 10rpx 50rpx 0;
+
+  .sche-wrap-text {
+    font-size: 24rpx;
+    color: #666;
+    margin-bottom: 20rpx;
+  }
+
+  .sche-bg {
+    position: relative;
+    background-color: #cccccc;
+    height: 30rpx;
+    border-radius: 100px;
+    width: 480rpx;
+    display: flex;
+    align-items: center;
+
+    .sche-bg-jindu {
+      position: absolute;
+      left: 0;
+      top: 0;
+      height: 30rpx;
+      min-width: 40rpx;
+      border-radius: 100px;
+      background: url(/static/images/round.png) #5775e7 center right 4rpx no-repeat;
+      background-size: 26rpx 26rpx;
+    }
+  }
+
+  .down-text {
+    font-size: 24rpx;
+    color: #5674e5;
+    margin-top: 16rpx;
+  }
+}
+</style>

BIN
static/images/close.png


BIN
static/images/img.png


BIN
static/images/round.png


BIN
static/images/update-img.png