Files
zhini_im/开发文档/版本更新需求/(红头)版本更新功能.txt
rw0067680 c01808ac21 first commit
Change-Id: Ib7c2ab10a2562044fcaf9879388a6cbc1db6ac61
2025-12-23 10:00:49 +08:00

257 lines
7.0 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 版本更新功能实现文档
## 功能概述
本功能实现了应用版本检查和更新提示,支持强制更新和可选更新两种模式。当检测到新版本时,会显示自定义的版本更新弹框,用户可以选择立即更新或稍后更新。
## 核心功能
### 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. 维护注意
- 定期检查接口状态
- 监控更新成功率
- 收集用户反馈
- 优化更新体验
## 总结
版本更新功能已完整实现,支持强制更新和可选更新两种模式,具有良好的用户体验和错误处理机制。通过自定义弹框和智能回退机制,确保了功能的稳定性和可靠性。