1 需求和目标
1.1 用户需求
APP在登录时,自动检测新版本,如果有新版本则提示升级。如果不升级则退出应用。
1.2 设计目标
通用的自动升级解决方案,可以推广到其他项目中。
2 升级现状
应用升级时,需要把打包好的APK拷贝到目标终端,然后安装升级。由此带来两点问题,一是新版本升级对用户体验不好;二是增加了实施工作。
3 需求分析
从用户的角度出发,分析功能需求,强制升级法,自动升级包括以下步骤:
1. 用户开启应用,进入登录页面;
2. 登录页面加载完成后,检测当前版本是否为最新版本;
a) 如果是最新版本,结束(升级流程);
b) 如果不是最新版本,提示用户升级;
i. 如果用户选择升级,则开始下载应用,下载完成后安装升级包,完成升级流程;
ii. 如果用户选择不升级,则退出应用。
4 方案设计
从系统角度出发,结合用户需求,设计系统应具备的功能。
4.1 应用端
应用端功能设计,主要功能有:
1. 检测新版本;
2. 获取当前版本;
3. 获取新版本下载地址;
4. 新版本下载;
5. 更新逻辑控制;
6. 记录用户更新历史
4.2 服务端
服务端功能设计,因为是使用WebService提供服务,所以接口至少应涵盖应用端的调用需求,主要接口应包括的功能有:
1. 检测新版本;
2. 获取新版本下载地址;
3. 应用更新记录(记录谁在什么时间获取了哪个版本);
4. 版本下载次数计算
4.3 数据库
数据库设计,只设计表结构,不涉及具体的数据库软件,便于扩充到其他数据库,当前为SQL Server
APP表:管理多个APP的基本信息
字段 |
说明 |
备注 |
ID |
自动编号 | |
Name |
应用名称 | |
Mark |
应用标识 | |
Logo |
图标 | |
Introduce |
介绍 |
APP_Version表:管理每个APP的版本
字段 |
说明 |
备注 |
ID |
自动编号 | |
Mark |
应用标识 | |
Version |
版本号 | |
ServerPath |
下载路径 | |
IsLastest |
最新版本标识 | |
ReleaseTime |
发布时间 | |
CRT |
下载次数(点击率) |
在APP点击日志表上增加触发器,自动计算CRT,或者用程序实现 |
APP_ChangeLog表:记录用户更新的历史信息
字段 |
说明 |
备注 |
ID |
自动编号 | |
UID |
用户标识 | |
Mark |
应用标识 |
记录用户获取的应用 |
Version |
版本 |
记录用户获取的应用版本 |
FetchTime |
获取时间 |
记录用户获取应用的时间 |
5 实现
5.1 应用端
关键代码:
获取当前应用版本号
appcan.widgetOne.getCurrentWidgetInfo(function(err, data,dataType, opId) {
if (err) {
//获取当前版本号失败
//appcan.window.alert("获取当前版本号失败");
} else {
//成功后,用当前版本号处理一些事情
var currentVersion = JSON.parse(data);
var currentVersionNo = currentVersion.version;
//appcan.window.alert("当前版本号:" + currentVersionNo);
}
下载远程文件
uexWindow.open('dd', '0', serverUrl, 0, 1,1, 0, 500);
5.2 服务端
IIS配置
在IIS的MIME类型中,配置增加.apk扩展名,以便支持.apk格式文件的下载
扩展名 |
MIME类型 |
.apk |
application/vnd.android.package-archive |
主要方法
///<summary>
///根据应用标识获取最新版本信息
///</summary>
publicvoid GetLastestVersion(string Mark);
///<summary>
///记录用户更新历史
///</summary>
publicvoid RecordUpdateHistory(string UID, string Mark, string Version);