最近用uniapp写了一个安卓壳子做app,遇到一个需求,校验app版本并更新
通过对比线上版本号和app自己的版本号的差异,唤起更新弹窗
相关代码
App.vue
export default {
onLaunch: function() {
this.checkVersion()
},
onShow: function() {
console.log('App Show')
},
onHide: function() {
console.log('App Hide')
},
methods: {
checkVersion() {
//https://www.xxxx.com.cn/api/App/GetAppVersion 用来获取app信息的接口
uni.request({
url: 'https://www.xxxx.com.cn/api/App/GetAppVersion',
method: 'get',
data: {},
header: {
'Content-Type': 'application/json', // 设置请求头
},
success: (res) => {
console.log('success', res)
if (res.data.Flag == 1) {
let {
Data
} = res.data
if (Data.VersionCode) {
plus.runtime.getProperty(plus.runtime.appid, function(wgtinfo) {
const newVersionCode = Data.VersionCode; //线上最新版本号
const selfVersionCode = wgtinfo.versionCode //当前APP应用版本
console.log('newVersionCode:',newVersionCode)
console.log('selfVersionCode:',selfVersionCode)
//线上版本号和当前不一样,进行在线升级
if (selfVersionCode != newVersionCode) {
let platform = uni.getSystemInfoSync().platform //手机平台
//安卓手机弹窗升级
if (platform === 'android') {
uni.navigateTo({
url: '/pages/upgrade/index'
})
}
}
});
}
}
},
fail: (err) => {
console.log('err', err)
},
});
}
}
}
/*每个页面公共css */
pages下的upgrade index.vue
发现新版本
更新内容
{{percentText}}
{{ isDownloadFinish ? '立即安装' :'下载中...'}}
立即更新
以后再说
立即更新
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: (290 * this.currentPercent / 100) + 'px' //510:按钮进度条宽度
}
},
//百分比文字
percentText() {
let percent = this.currentPercent;
if (typeof percent !== 'number' || isNaN(percent)) return '下载中...'
if (percent {
console.log('success', res)
if (res.data.Flag == 1) {
let {
Data
} = res.data
if (Data.VersionCode) {
this.versionName = Data.VersionCode; //版本名称
this.versionDesc = Data.Describe; //更新说明
this.downloadUrl = Data.Url; //下载链接
this.isForceUpdate = false; //是否强制更新
}
}
},
fail: (err) => {
console.log('err', err)
},
});
},
//更新
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.navigateB服务器托管网ack()
})
}
},
//关闭返回
handleClose() {
uni.navigateBack()
// uni.navigateTo({
// url: '/pages/login/index'
// })
},
}
}
page {
background: rgba(0, 0, 0, 0.5);/**设置窗口背景半透明*/
}
.upgrade-popup {
width: 290px;
height: auto;
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background: #fff;
border-radius: 10px;
box-sizing: border-box;
border: 1px solid #eee;
}
.header-bg {
width: 100%;
margin-top: -112rpx;
}
.upgrade-main {
padding: 5px 15px 15px;
box-sizing: border-box;
.version {
font-size: 18px;
color: #026DF7;
font-weight: 700;
width: 100%;
text-align: center;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
letter-spacing: 1px;
}
.upgrade-content {
margin-top: 30px;
.title {
font-size: 14px;
font-weight: 700;
color: #000000;
}
.desc {
box-sizing: border-box;
margin-top: 10px;
font-size: 14px;
color: #6A6A6A;
max-height: 80vh;
overflow-y: auto;
}
}
.footer {
width: 100%;
display: flex;
justify-content: center;
align-items: center;
position: relative;
flex-shrink: 0;
margin-top: 50px;
.btn {
width: 123px;
display: flex;
justify-content: center;
align-items: center;
position: relative;
z-index: 999;
height: 48px;
box-sizing: border-box;
font-size: 16p服务器托管网x;
border-radius: 5px;
letter-spacing: 1px;
&.force {
width: 250px;
}
&.close {
border: 1px solid #E0E0E0;
margin-right: 12px;
color: #000;
}
&.upgrade {
background-color: #026DF7;
color: white;
}
}
.progress-view {
width: 255px;
height: 24px;
display: flex;
position: relative;
align-items: center;
border-radius: 3px;
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: 5px;
border-bottom-left-radius: 5px;
}
.txt {
font-size: 14px;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
color: #fff;
}
}
}
}
pages下的upgrade upgrade.js
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: // 已接收到数据
let hasProgress = task.totalSize && task.totalSize > 0 //是否能获取到App大小
if (hasProgress) {
let current = parseInt(100 * task.downloadedSize / task.totalSize); //获取下载进度百分比
progressCallBack(current)
}
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); //监听APP安装
filter.addDataScheme("package");
mainActivity.registerReceiver(receiver, filter); //注册广播
}
pages.json
{
"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
{
"path": "pages/index/index",
"style": {
"navigationStyle": "custom"
}
},
{
"path": "pages/upgrade/index", //升级窗口页面
"style": {
"navigationBarTitleText": "",
"navigationStyle": "custom",
"app-plus": {
"bounce": "none",
"animationType":"none", //取消窗口动画
"background": "transparent" // 设置背景透明
}
}
}
],
"globalStyle": {
"navigationBarTextStyle": "black",
// "navigationBarTitleText": "uni-app",
"navigationBarBackgroundColor": "#F8F8F8",
"backgroundColor": "#F8F8F8"
},
"uniIdRouter": {}
}
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
相关推荐: MongoDB从入门到实战之MongoDB快速入门
前言 上一章节主要概述了MongoDB的优劣势、应用场景和发展史。这一章节将快速的概述一下MongoDB的基本概念,带领大家快速入门MongoDB这个文档型的NoSQL数据库。 MongoDB从入门到实战的相关教程 MongoDB从入门到实战之MongoD…