起因

每次都通过发送安装包或者扫码下载太麻烦了,故用内部版本迭代的方式。

uniapp

1、新建util目录js文件

index.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
// 版本更新方法
const versionMCompare = () => {
let _this = this;
//系统版本升级判断接口(后台获取服务器)
var urlfun = "自己的接口"
// #ifdef APP-PLUS
/** 锁定屏幕方向 */
plus.screen.lockOrientation('portrait-primary');
console.log("onLaunch锁定屏幕方向")
/** 检测升级 */
// 取得版本号
plus.runtime.getProperty(plus.runtime.appid, function(info) {
// 版本号变量持久化存储
getApp().globalData.editionnum = info.version; //版本号持久化存储做其它备用
// console.log("当前应用版本:" + info.version + "---" + plus.runtime.version);
// console.log("appid:" +plus.runtime.appid);
// console.log("appid基座版本号:" +plus.runtime.version);
uni.request({
url: urlfun, //接口地址。url
method: "POST", //传输类型
data: {
"appid": plus.runtime.appid,
"version": plus.runtime.version,
"system": uni.getStorageSync('systemname'),
"editionnum": info.version,
}, //必要参数
// header: data.header, //https 请求头参数
success: (res) => {
console.log("--返回状态--" + JSON.stringify(res.data));
var data = res.data;
var status = data.status;
// 判断返回结果,调用升级方法
if (status == 200) {
// 开始调用 data = 服务器返回的数据里面有 新的版本号,下载地址
checkVersionToLoadUpdate(info.version, data);
} else {
uni.showToast({
title: data.msg,
duration: 1500
});
}
}
});
})
// #endif
}

// 进行版本比较及下载
const downloadVersion = (server_version, data) =>{
if (server_version !== data.edition) {
//TODO 此处判断是否为 WIFI连接状态
if (plus.networkinfo.getCurrentType() != 3) {
uni.showToast({
title: '有新的版本发布,检测到您目前非Wifi连接,为节约您的流量,程序已停止自动更新,将在您连接WIFI之后重新检测更新',
mask: true,
duration: 8000,
icon: "none"
});
return;
} else {
uni.showModal({
title: "版本更新",
content: '有新的版本发布,检测到您当前为Wifi连接,是否立即进行新版本下载?',
confirmText: '立即更新',
cancelText: '稍后进行',
success: function(res) {
if (res.confirm) {
uni.showToast({
icon: "none",
mask: true,
title: '有新的版本发布,检测到您目前为Wifi连接,程序已启动自动更新。新版本下载完成后将自动弹出安装程序。',
duration: 5000,
});
//设置 最新版本apk的下载链接
var downloadApkUrl = data.uplodurl;
var dtask = plus.downloader.createDownload(downloadApkUrl, {}, function(d,
status) {
// 下载完成
if (status == 200) {
plus.runtime.install(plus.io.convertLocalFileSystemURL(d
.filename), {}, {}, function(error) {
uni.showToast({
title: '安装失败',
duration: 1500
});
})
} else {
uni.showToast({
title: '更新失败',
duration: 1500
});
}
});
dtask.start();
} else if (res.cancel) {
console.log('稍后更新');
}
}
});
}
}
}

export {
versionMCompare,
downloadVersion
}

2、App引用

在APP.vue的onLaunch内引用

1
2
3
4
5
6
7
8
   import {versionMCompare} from '@/util/index.js'
export default {
onLaunch: function() {
// #ifdef APP-PLUS
versionMCompare()
// #endif
}
}

3、后端接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 这里直接测试写法写死了,可拉个数据库,每次从数据库里取
class AppBase(BaseModel):
appid: str
version: str
system: str
editionnum: str


@router.post('/app')
async def Update_App_V(item: AppBase):
data = {
"status": 200,
"appid": item.appid,
"version": item.version,
"system": item.system,
"editionnum": item.editionnum,
"url": "apk下载地址",
"edition": '1.0.6'
}
return data