257 lines
7.0 KiB
Plaintext
257 lines
7.0 KiB
Plaintext
# 版本更新功能实现文档
|
||
|
||
## 功能概述
|
||
|
||
本功能实现了应用版本检查和更新提示,支持强制更新和可选更新两种模式。当检测到新版本时,会显示自定义的版本更新弹框,用户可以选择立即更新或稍后更新。
|
||
|
||
## 核心功能
|
||
|
||
### 1. 版本检查
|
||
- **接口**: `/api/common/checkAppVersion`
|
||
- **触发时机**: 应用启动时自动检查(只执行一次)
|
||
- **检查逻辑**: 比较当前版本与服务器最新版本
|
||
- **防重复机制**: 使用 `versionChecked` 标志确保只检查一次
|
||
|
||
### 2. 更新弹框
|
||
- **自定义弹框**: 使用 `version_dailog.xml` 布局
|
||
- **系统弹框**: 作为备用方案
|
||
- **强制更新**: 不可取消,只显示"立即更新"按钮
|
||
- **可选更新**: 可取消,显示"立即更新"和"稍后更新"按钮
|
||
|
||
### 3. 更新下载
|
||
- **下载管理**: 使用 `UpdateManager` 处理下载
|
||
- **应用商店**: 支持跳转到各厂商应用商店
|
||
- **直接下载**: 支持直接下载APK文件
|
||
|
||
## 技术实现
|
||
|
||
### 1. 主要类文件
|
||
|
||
#### MainActivity.java
|
||
- **位置**: `app/src/main/java/com/xunpaisoft/social/im/main/MainActivity.java`
|
||
- **功能**: 主Activity,集成版本检查逻辑
|
||
- **关键方法**:
|
||
- `initDialog()`: 初始化版本检查
|
||
- `requestVersion()`: 请求版本信息
|
||
- `showUpdateDialog()`: 显示更新弹框
|
||
- `showCustomUpdateDialog()`: 显示自定义弹框
|
||
- `showSimpleUpdateDialog()`: 显示系统弹框
|
||
|
||
#### VersionUpdateManager.java
|
||
- **位置**: `app/src/main/java/com/xunpaisoft/social/utils/VersionUpdateManager.java`
|
||
- **功能**: 版本更新管理工具类
|
||
- **关键方法**:
|
||
- `checkVersion()`: 检查版本更新
|
||
- `formatUpdateContent()`: 格式化更新内容
|
||
- `getMarketPackage()`: 获取应用商店包名
|
||
- `openAppStore()`: 打开应用商店
|
||
|
||
#### CheckAppVersionResult.java
|
||
- **位置**: `uikit/src/main/java/cn/wildfire/chat/kit/net/model/CheckAppVersionResult.java`
|
||
- **功能**: 版本检查结果数据模型
|
||
- **关键字段**:
|
||
- `version_name`: 版本名称
|
||
- `version_code`: 版本代码
|
||
- `update_content`: 更新内容
|
||
- `download_url`: 下载链接
|
||
- `is_force_update`: 是否强制更新
|
||
- `is_latest`: 是否最新版本
|
||
|
||
#### VersionUtils.java
|
||
- **位置**: `app/src/main/java/com/xunpaisoft/social/utils/VersionUtils.java`
|
||
- **功能**: 版本相关工具类
|
||
- **关键方法**:
|
||
- `getVersionName()`: 获取版本名称
|
||
- `getVersionCode()`: 获取版本代码
|
||
- `getPackageName()`: 获取包名
|
||
- `getAppName()`: 获取应用名称
|
||
|
||
### 2. 布局文件
|
||
|
||
#### version_dailog.xml
|
||
- **位置**: `app/src/main/res/layout/version_dailog.xml`
|
||
- **功能**: 自定义版本更新弹框布局
|
||
- **组件**:
|
||
- 标题: "发现新版本"
|
||
- 版本号显示
|
||
- 更新内容列表
|
||
- 立即更新按钮
|
||
- 稍后更新按钮
|
||
|
||
### 3. 网络请求
|
||
|
||
#### AppService.java
|
||
- **位置**: `uikit/src/main/java/cn/wildfire/chat/kit/net/AppService.java`
|
||
- **功能**: 应用服务API调用
|
||
- **关键方法**:
|
||
- `checkAppVersion()`: 检查应用版本
|
||
|
||
## 功能特性
|
||
|
||
### 1. 强制更新模式
|
||
- **触发条件**: 服务器返回 `is_force_update = "1"`
|
||
- **弹框行为**:
|
||
- 不可点击外部关闭
|
||
- 不可按返回键关闭
|
||
- 只显示"立即更新"按钮
|
||
- **用户体验**: 用户必须更新才能继续使用应用
|
||
|
||
### 2. 可选更新模式
|
||
- **触发条件**: 服务器返回 `is_force_update = "0"`
|
||
- **弹框行为**:
|
||
- 可以点击外部关闭
|
||
- 可以按返回键关闭
|
||
- 显示"立即更新"和"稍后更新"按钮
|
||
- **用户体验**: 用户可以选择稍后更新
|
||
|
||
### 3. 智能回退机制
|
||
- **主方案**: 优先使用自定义弹框
|
||
- **备用方案**: 自定义弹框失败时自动使用系统弹框
|
||
- **错误处理**: 完善的异常捕获和日志记录
|
||
|
||
### 4. 多厂商支持
|
||
- **华为**: 华为应用市场
|
||
- **小米**: 小米应用商店
|
||
- **OPPO**: OPPO软件商店
|
||
- **VIVO**: VIVO应用商店
|
||
- **魅族**: 魅族应用商店
|
||
- **默认**: 腾讯应用宝
|
||
|
||
## 使用流程
|
||
|
||
### 1. 应用启动
|
||
```
|
||
MainActivity.afterViews()
|
||
→ initDialog() (仅首次执行)
|
||
→ requestVersion()
|
||
→ VersionUpdateManager.checkVersion()
|
||
```
|
||
|
||
**重要说明**: 版本检查只在应用启动时执行一次,不会在每次 Activity 重新获取焦点时重复执行。
|
||
|
||
### 2. 版本检查
|
||
```
|
||
AppService.checkAppVersion()
|
||
→ 网络请求
|
||
→ 解析响应
|
||
→ 比较版本
|
||
```
|
||
|
||
### 3. 显示弹框
|
||
```
|
||
showUpdateDialog()
|
||
→ showCustomUpdateDialog()
|
||
→ ADialog.onCreate()
|
||
→ 设置弹框行为
|
||
```
|
||
|
||
### 4. 用户操作
|
||
```
|
||
点击"立即更新"
|
||
→ startUpdateDownload()
|
||
→ UpdateManager.checkUpdateDownload()
|
||
```
|
||
|
||
## 配置说明
|
||
|
||
### 1. 接口参数
|
||
- **version**: 当前版本名称
|
||
- **versionCode**: 当前版本代码
|
||
- **platform**: 平台标识(Android = "2")
|
||
|
||
### 2. 响应格式
|
||
```json
|
||
{
|
||
"code": 0,
|
||
"message": "success",
|
||
"data": {
|
||
"id": 1,
|
||
"platform": "2",
|
||
"version_code": 6,
|
||
"version_name": "1.1.6",
|
||
"update_content": "1. 朋友圈增加评论回复、删除功能;\n2. 新增本机号码一键登录功能;\n3. 朋友圈列表展示当前位置;\n4. 修复已知bug,优化用户体验",
|
||
"download_url": "https://example.com/app.apk",
|
||
"file_size": 50000000,
|
||
"is_force_update": "1",
|
||
"is_latest": "0",
|
||
"status": "1",
|
||
"createtime": 1640995200000,
|
||
"updatetime": 1640995200000
|
||
}
|
||
}
|
||
```
|
||
|
||
### 3. 权限配置
|
||
```xml
|
||
<uses-permission android:name="android.permission.INTERNET" />
|
||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
||
```
|
||
|
||
## 调试信息
|
||
|
||
### 1. 日志标签
|
||
- `MainActivity`: 主Activity相关日志
|
||
- `VersionUpdateManager`: 版本管理相关日志
|
||
- `ADialog`: 自定义弹框相关日志
|
||
|
||
### 2. 关键日志
|
||
```
|
||
检查强制更新状态: true/false
|
||
is_force_update原始值: 1/0
|
||
版本数据: V1.1.6, 强制更新: 1
|
||
设置强制更新模式:弹框不可取消
|
||
强制更新:隐藏稍后更新按钮
|
||
```
|
||
|
||
### 3. 错误处理
|
||
- 网络请求失败
|
||
- JSON解析错误
|
||
- 弹框显示异常
|
||
- 下载启动失败
|
||
|
||
## 测试验证
|
||
|
||
### 1. 功能测试
|
||
- [ ] 版本检查正常
|
||
- [ ] 强制更新弹框不可取消
|
||
- [ ] 可选更新弹框可以取消
|
||
- [ ] 按钮显示正确
|
||
- [ ] 更新内容格式化正确
|
||
|
||
### 2. 兼容性测试
|
||
- [ ] 不同Android版本
|
||
- [ ] 不同厂商设备
|
||
- [ ] 不同网络环境
|
||
- [ ] 不同屏幕尺寸
|
||
|
||
### 3. 异常测试
|
||
- [ ] 网络断开
|
||
- [ ] 服务器异常
|
||
- [ ] 数据格式错误
|
||
- [ ] 权限不足
|
||
|
||
## 注意事项
|
||
|
||
### 1. 开发注意
|
||
- 确保网络权限已配置
|
||
- 测试不同厂商设备
|
||
- 验证强制更新逻辑
|
||
- 检查弹框显示效果
|
||
|
||
### 2. 部署注意
|
||
- 服务器接口必须可用
|
||
- 版本号格式要正确
|
||
- 下载链接要有效
|
||
- 强制更新要谨慎使用
|
||
|
||
### 3. 维护注意
|
||
- 定期检查接口状态
|
||
- 监控更新成功率
|
||
- 收集用户反馈
|
||
- 优化更新体验
|
||
|
||
## 总结
|
||
|
||
版本更新功能已完整实现,支持强制更新和可选更新两种模式,具有良好的用户体验和错误处理机制。通过自定义弹框和智能回退机制,确保了功能的稳定性和可靠性。
|