增加更新进度条
This commit is contained in:
parent
1fb54251af
commit
15a1b16de3
2
.gitignore
vendored
2
.gitignore
vendored
@ -28,4 +28,4 @@ unpackage
|
||||
*.sln
|
||||
*.sw?
|
||||
/node_modules
|
||||
/unpackage/
|
||||
/unpackage
|
||||
|
||||
@ -1596,6 +1596,14 @@
|
||||
"enablePullDownRefresh": false
|
||||
}
|
||||
|
||||
} ,{
|
||||
"path" : "pages/lq-upgrade/upgrade",
|
||||
"style" :
|
||||
{
|
||||
"navigationBarTitleText": "",
|
||||
"enablePullDownRefresh": false
|
||||
}
|
||||
|
||||
}
|
||||
],
|
||||
// "subPackages":[{
|
||||
|
||||
73
pages/lq-upgrade/checkVersion.js
Normal file
73
pages/lq-upgrade/checkVersion.js
Normal file
@ -0,0 +1,73 @@
|
||||
/**
|
||||
* 检查app版本是否需要升级
|
||||
*/
|
||||
const checkVersion = ({
|
||||
name, //最新版本名称
|
||||
code, //最新版本号
|
||||
content, //更新内容
|
||||
url, //下载链接
|
||||
forceUpdate //是否强制升级
|
||||
}) => {
|
||||
// const selfVersionCode = Number(uni.getSystemInfoSync().appVersionCode); //当前App版本号
|
||||
let selfVersionCode = ''
|
||||
//获取当前应用版本
|
||||
plus.runtime.getProperty(plus.runtime.appid, function(widgetInfo) {
|
||||
// console.log('版本号的数据信息', widgetInfo.version);//其实是应用版本名称
|
||||
// console.log('应用版本名称', widgetInfo.version);
|
||||
// that.versionName = widgetInfo.version
|
||||
// console.log('应用版本号', widgetInfo.versionCode);
|
||||
selfVersionCode = widgetInfo.versionCode
|
||||
console.log('selfVersionCode',selfVersionCode,code)
|
||||
//线上版本号高于当前,进行在线升级
|
||||
if (code > selfVersionCode) {
|
||||
let platform = uni.getSystemInfoSync().platform //手机平台
|
||||
console.log('platform',platform,getCurrentPageRoute())
|
||||
//安卓手机弹窗升级
|
||||
debugger
|
||||
if (platform === 'android') {
|
||||
console.log('1111111111111111111')
|
||||
//当前页面不是升级页面跳转防止多次打开
|
||||
if (getCurrentPageRoute() !== 'pages/lq-upgrade/upgrade') {
|
||||
console.log('22222222222222222222222222')
|
||||
uni.navigateTo({
|
||||
url: '/pages/lq-upgrade/upgrade',
|
||||
success() {
|
||||
uni.$emit('upgrade-app', {
|
||||
name,
|
||||
content,
|
||||
url,
|
||||
forceUpdate
|
||||
})
|
||||
},
|
||||
fail(res) {
|
||||
console.log('---333333333333',res)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
//IOS无法在线升级提示到商店下载
|
||||
else {
|
||||
uni.showModal({
|
||||
title: '发现新版本 ' + newVersionName,
|
||||
content: '请到App store进行升级',
|
||||
showCancel: false
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
//获取当前页面url
|
||||
const getCurrentPageRoute = () => {
|
||||
let currentRoute;
|
||||
let pages = getCurrentPages() // 获取栈实例
|
||||
if (pages&&pages.length) {
|
||||
currentRoute = pages[pages.length - 1].route;
|
||||
|
||||
}
|
||||
return currentRoute
|
||||
}
|
||||
|
||||
export default checkVersion
|
||||
93
pages/lq-upgrade/upgrade.js
Normal file
93
pages/lq-upgrade/upgrade.js
Normal file
@ -0,0 +1,93 @@
|
||||
/**
|
||||
* @description H5+下载App
|
||||
* @param downloadUrl:App下载链接
|
||||
* @param progressCallBack:下载进度回调
|
||||
*/
|
||||
export const downloadApp = (downloadUrl, progressCallBack = () => {}, ) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
//创建下载任务
|
||||
const downloadTask = plus.downloader.createDownload(downloadUrl, {
|
||||
method: "GET"
|
||||
}, (task, status) => {
|
||||
console.log(status,'status')
|
||||
if (status == 200) { //下载成功
|
||||
resolve(task.filename)
|
||||
|
||||
} else {
|
||||
reject('fail')
|
||||
uni.showToast({
|
||||
title: '下载失败',
|
||||
duration: 1500,
|
||||
icon: "none"
|
||||
});
|
||||
}
|
||||
})
|
||||
//监听下载过程
|
||||
downloadTask.addEventListener("statechanged", (task, status) => {
|
||||
switch (task.state) {
|
||||
case 1: // 开始
|
||||
break;
|
||||
case 2: //已连接到服务器
|
||||
break;
|
||||
case 3: // 已接收到数据
|
||||
console.log(task,'task')
|
||||
let hasProgress = task.totalSize && task.totalSize > 0 //是否能获取到App大小
|
||||
if (hasProgress) {
|
||||
let current = parseInt(100 * task.downloadedSize / task.totalSize); //获取下载进度百分比
|
||||
progressCallBack(current,task.downloadedSize,task.totalSize)
|
||||
}
|
||||
break;
|
||||
case 4: // 下载完成
|
||||
break;
|
||||
}
|
||||
});
|
||||
//开始执行下载
|
||||
downloadTask.start();
|
||||
})
|
||||
|
||||
|
||||
}
|
||||
/**
|
||||
* @description H5+安装APP
|
||||
* @param fileName:app文件名
|
||||
* @param callBack:安装成功回调
|
||||
*/
|
||||
export const installApp = (fileName, callBack = () => {}) => {
|
||||
//注册广播监听app安装情况
|
||||
onInstallListening(callBack);
|
||||
//开始安装
|
||||
plus.runtime.install(plus.io.convertLocalFileSystemURL(fileName), {}, () => {
|
||||
//成功跳转到安装界面
|
||||
}, function(error) {
|
||||
uni.showToast({
|
||||
title: '安装失败',
|
||||
duration: 1500,
|
||||
icon: "none"
|
||||
});
|
||||
})
|
||||
|
||||
}
|
||||
/**
|
||||
* @description 注册广播监听APP是否成功
|
||||
* @param callBack:安装成功回调函数
|
||||
*/
|
||||
const onInstallListening = (callBack = () => {}) => {
|
||||
|
||||
let mainActivity = plus.android.runtimeMainActivity(); //获取activity
|
||||
//生成广播接收器
|
||||
let receiver = plus.android.implements('io.dcloud.android.content.BroadcastReceiver', {
|
||||
onReceive: (context, intent) => { //接收广播回调
|
||||
plus.android.importClass(intent);
|
||||
mainActivity.unregisterReceiver(receiver); //取消监听
|
||||
callBack()
|
||||
}
|
||||
});
|
||||
let IntentFilter = plus.android.importClass('android.content.IntentFilter');
|
||||
let Intent = plus.android.importClass('android.content.Intent');
|
||||
let filter = new IntentFilter();
|
||||
filter.addAction(Intent.ACTION_PACKAGE_ADDED); //监听apk安装
|
||||
filter.addDataScheme("package");
|
||||
mainActivity.registerReceiver(receiver, filter); //注册广播
|
||||
|
||||
|
||||
}
|
||||
277
pages/lq-upgrade/upgrade.vue
Normal file
277
pages/lq-upgrade/upgrade.vue
Normal file
@ -0,0 +1,277 @@
|
||||
<template>
|
||||
<view class="upgrade-popup">
|
||||
<image class="header-bg" src="./upgrade_bg.png" mode="widthFix"></image>
|
||||
<view class="main">
|
||||
<view class="version">发现新版本{{versionName}}</view>
|
||||
<view class="content">
|
||||
<text class="title">更新内容</text>
|
||||
<view class="desc" v-html="versionDesc"></view>
|
||||
</view>
|
||||
<!--下载状态-进度条显示 -->
|
||||
<view class="footer" v-if="isStartDownload">
|
||||
<view class="progress-view" :class="{'active':!hasProgress}" @click="handleInstallApp">
|
||||
<!-- 进度条 -->
|
||||
<view v-if="hasProgress" style="height: 100%;">
|
||||
<view class="txt">{{percentText}}</view>
|
||||
<view class="progress" :style="setProStyle"></view>
|
||||
</view>
|
||||
<view v-else>
|
||||
<view class="btn upgrade force">{{ isDownloadFinish ? '立即安装' :'下载中...'}}</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 强制更新 -->
|
||||
<view class="footer" v-else-if="isForceUpdate">
|
||||
<view class="btn upgrade force" @click="handleUpgrade">立即更新</view>
|
||||
</view>
|
||||
<!-- 可选择更新 -->
|
||||
<view class="footer" v-else>
|
||||
<view class="btn close" @click="handleClose">以后再说</view>
|
||||
<view class="btn upgrade" @click="handleUpgrade">立即更新</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {
|
||||
downloadApp,
|
||||
installApp
|
||||
} from './upgrade.js'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
isForceUpdate: false, //是否强制更新
|
||||
versionName: '', //版本名称
|
||||
versionDesc: '', //更新说明
|
||||
downloadUrl: '', //APP下载链接
|
||||
isDownloadFinish: false, //是否下载完成
|
||||
hasProgress: false, //是否能显示进度条
|
||||
currentPercent: 0, //当前下载百分比
|
||||
isStartDownload: false, //是否开始下载
|
||||
fileName: '', //下载后app本地路径名称
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
//设置进度条样式,实时更新进度位置
|
||||
setProStyle() {
|
||||
return {
|
||||
width: (510 * this.currentPercent / 100) + 'rpx' //510:按钮进度条宽度
|
||||
}
|
||||
},
|
||||
//百分比文字
|
||||
percentText() {
|
||||
let percent = this.currentPercent;
|
||||
if (typeof percent !== 'number' || isNaN(percent)) return '下载中...'
|
||||
if (percent < 100) return `下载中${percent}%`
|
||||
return '立即安装'
|
||||
|
||||
}
|
||||
},
|
||||
|
||||
onBackPress(options) {
|
||||
// 禁用返回
|
||||
if (options.from == 'backbutton') {
|
||||
return true;
|
||||
}
|
||||
|
||||
},
|
||||
created() {
|
||||
uni.$on('upgrade-app',this.bindEmit)
|
||||
},
|
||||
beforeDestroy() {
|
||||
uni.$off('upgrade-app',this.bindEmit)
|
||||
},
|
||||
methods: {
|
||||
bindEmit(e){
|
||||
let {name,content,url,forceUpdate}=e
|
||||
this.isForceUpdate=forceUpdate
|
||||
this.versionName=name
|
||||
this.versionDesc=content
|
||||
this.downloadUrl=url
|
||||
},
|
||||
//更新
|
||||
handleUpgrade() {
|
||||
if (this.downloadUrl) {
|
||||
this.isStartDownload = true
|
||||
//开始下载App
|
||||
downloadApp(this.downloadUrl, current => {
|
||||
//下载进度监听
|
||||
this.hasProgress = true
|
||||
this.currentPercent = current
|
||||
|
||||
}).then(fileName => {
|
||||
//下载完成
|
||||
this.isDownloadFinish = true
|
||||
this.fileName = fileName
|
||||
if (fileName) {
|
||||
//自动安装App
|
||||
this.handleInstallApp()
|
||||
}
|
||||
}).catch(e => {
|
||||
console.log(e, 'e')
|
||||
})
|
||||
} else {
|
||||
uni.showToast({
|
||||
title: '下载链接不存在',
|
||||
icon: 'none'
|
||||
})
|
||||
}
|
||||
|
||||
},
|
||||
//安装app
|
||||
handleInstallApp() {
|
||||
//下载完成才能安装,防止下载过程中点击
|
||||
if (this.isDownloadFinish && this.fileName) {
|
||||
installApp(this.fileName, () => {
|
||||
//安装成功,关闭升级弹窗
|
||||
uni.navigateBack()
|
||||
})
|
||||
}
|
||||
},
|
||||
//关闭返回
|
||||
handleClose() {
|
||||
uni.navigateBack()
|
||||
},
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
page {
|
||||
background: rgba(0, 0, 0, 0.5);/**设置窗口背景半透明*/
|
||||
}
|
||||
</style>
|
||||
<style lang="scss" scoped>
|
||||
.upgrade-popup {
|
||||
width: 580rpx;
|
||||
height: auto;
|
||||
position: fixed;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
background: #fff;
|
||||
border-radius: 20rpx;
|
||||
box-sizing: border-box;
|
||||
border: 1px solid #eee;
|
||||
}
|
||||
|
||||
.header-bg {
|
||||
width: 100%;
|
||||
margin-top: -112rpx;
|
||||
}
|
||||
|
||||
.main {
|
||||
padding: 10rpx 30rpx 30rpx;
|
||||
box-sizing: border-box;
|
||||
.version {
|
||||
font-size: 36rpx;
|
||||
color: #026DF7;
|
||||
font-weight: 700;
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
|
||||
.content {
|
||||
margin-top: 60rpx;
|
||||
|
||||
.title {
|
||||
font-size: 28rpx;
|
||||
font-weight: 700;
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
.desc {
|
||||
box-sizing: border-box;
|
||||
margin-top: 20rpx;
|
||||
font-size: 28rpx;
|
||||
color: #6A6A6A;
|
||||
max-height: 40vh;
|
||||
overflow-y: auto;
|
||||
}
|
||||
}
|
||||
|
||||
.footer {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
position: relative;
|
||||
flex-shrink: 0;
|
||||
margin-top: 100rpx;
|
||||
|
||||
.btn {
|
||||
width: 246rpx;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
position: relative;
|
||||
z-index: 999;
|
||||
height: 96rpx;
|
||||
box-sizing: border-box;
|
||||
font-size: 32rpx;
|
||||
border-radius: 10rpx;
|
||||
letter-spacing: 2rpx;
|
||||
|
||||
&.force {
|
||||
width: 500rpx;
|
||||
}
|
||||
|
||||
&.close {
|
||||
border: 1px solid #E0E0E0;
|
||||
margin-right: 25rpx;
|
||||
color: #000;
|
||||
}
|
||||
|
||||
&.upgrade {
|
||||
background-color: #026DF7;
|
||||
color: white;
|
||||
}
|
||||
}
|
||||
|
||||
.progress-view {
|
||||
width: 510rpx;
|
||||
height: 90rpx;
|
||||
display: flex;
|
||||
position: relative;
|
||||
align-items: center;
|
||||
border-radius: 6rpx;
|
||||
background-color: #dcdcdc;
|
||||
display: flex;
|
||||
justify-content: flex-start;
|
||||
padding: 0px;
|
||||
box-sizing: border-box;
|
||||
border: none;
|
||||
overflow: hidden;
|
||||
|
||||
&.active {
|
||||
background-color: #026DF7;
|
||||
}
|
||||
|
||||
.progress {
|
||||
height: 100%;
|
||||
background-color: #026DF7;
|
||||
padding: 0px;
|
||||
box-sizing: border-box;
|
||||
border: none;
|
||||
border-top-left-radius: 10rpx;
|
||||
border-bottom-left-radius: 10rpx;
|
||||
|
||||
}
|
||||
|
||||
.txt {
|
||||
font-size: 28rpx;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
color: #fff;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
BIN
pages/lq-upgrade/upgrade_bg.png
Normal file
BIN
pages/lq-upgrade/upgrade_bg.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 41 KiB |
@ -142,6 +142,7 @@
|
||||
<script>
|
||||
import headers from '../../../components/headers/headers.vue'
|
||||
import footers from '../../../components/footers/footers.vue'
|
||||
import checkVersion from '@/pages/lq-upgrade/checkVersion.js'
|
||||
import {
|
||||
closeBle
|
||||
} from '@/static/js/BLEConn.js'
|
||||
@ -359,43 +360,57 @@
|
||||
let jxjAppVersionNo = res2.result.versionNo
|
||||
|
||||
if (res2.result && jxjAppVersionNo !== that.versionNo) {
|
||||
uni.showModal({
|
||||
title: '版本更新',
|
||||
content: '更新内容:' + res2.result.versionDescribe,
|
||||
// confirmText: '更新',
|
||||
showCancel: false,
|
||||
success(res) {
|
||||
if (res.confirm) {
|
||||
console.log('用户点击确定')
|
||||
// var url = that.url_config + 'image/' + JSON.parse(res2.result.downloadUrl)[0].url//地址拼错啦,直接返回的就是下载地址
|
||||
var url = JSON.parse(res2.result.downloadUrl)[0].url
|
||||
console.log('apk地址', url)
|
||||
uni.showModal({
|
||||
title: '提示',
|
||||
content: '正在后台下载更新资源,请耐心等待......',
|
||||
showCancel: false
|
||||
})
|
||||
uni.downloadFile({
|
||||
url: url,
|
||||
success: (res) => {
|
||||
// uni.hideLoading()
|
||||
console.log('res', res)
|
||||
if (res.statusCode === 200) {
|
||||
console.log('下载成功')
|
||||
var fileSaveUrl = plus.io
|
||||
.convertLocalFileSystemURL(
|
||||
res.tempFilePath
|
||||
)
|
||||
plus.runtime.openFile(res
|
||||
.tempFilePath) //选择软件打开文件
|
||||
}
|
||||
}
|
||||
})
|
||||
} else if (res.cancel) {
|
||||
console.log('用户点击取消')
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
let name=res2.result.versionName;//新版本名称
|
||||
let code=res2.result.versionNo;//新版本号(数字)
|
||||
let content=res2.result.versionDescribe;//更新内容
|
||||
let url=JSON.parse(res2.result.downloadUrl)[0].url;//app下载链接,(演示请换成真正在下载链接)
|
||||
let forceUpdate=false;//是否强制更新
|
||||
checkVersion({
|
||||
name,//最新版本名称
|
||||
code,//最新版本号
|
||||
content,//更新内容
|
||||
url,//下载链接
|
||||
forceUpdate//是否强制升级
|
||||
})
|
||||
|
||||
// uni.showModal({
|
||||
// title: '版本更新',
|
||||
// content: '更新内容:' + res2.result.versionDescribe,
|
||||
// // confirmText: '更新',
|
||||
// showCancel: false,
|
||||
// success(res) {
|
||||
// if (res.confirm) {
|
||||
// console.log('用户点击确定')
|
||||
// // var url = that.url_config + 'image/' + JSON.parse(res2.result.downloadUrl)[0].url//地址拼错啦,直接返回的就是下载地址
|
||||
// var url = JSON.parse(res2.result.downloadUrl)[0].url
|
||||
// console.log('apk地址', url)
|
||||
// uni.showModal({
|
||||
// title: '提示',
|
||||
// content: '正在后台下载更新资源,请耐心等待......',
|
||||
// showCancel: false
|
||||
// })
|
||||
// uni.downloadFile({
|
||||
// url: url,
|
||||
// success: (res) => {
|
||||
// // uni.hideLoading()
|
||||
// console.log('res', res)
|
||||
// if (res.statusCode === 200) {
|
||||
// console.log('下载成功')
|
||||
// var fileSaveUrl = plus.io
|
||||
// .convertLocalFileSystemURL(
|
||||
// res.tempFilePath
|
||||
// )
|
||||
// plus.runtime.openFile(res
|
||||
// .tempFilePath) //选择软件打开文件
|
||||
// }
|
||||
// }
|
||||
// })
|
||||
// } else if (res.cancel) {
|
||||
// console.log('用户点击取消')
|
||||
// }
|
||||
// }
|
||||
// })
|
||||
} else {
|
||||
// uni.showToast({
|
||||
// title: '您已经是最新版本啦!',
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user