# 分析方案

## 变更内容总结
1. **iOS后台任务系统重构** - 修复后台任务无法自动运行的问题
2. **日志系统优化** - 改进日志记录机制,添加队列和批量写入
3. **文档新增** - 添加后台任务修复总结和测试指南文档
4. **应用启动优化** - 添加后台任务状态检查和恢复逻辑
5. **版本号更新** - Info.plist版本从1.0.23升级到1.0.24

## 提交信息类型判断
- **主要类型**: `fix` - 这是一个重要的bug修复,解决了iOS后台任务无法自动运行的核心问题
- **作用域**: `ios-background` - 专注于iOS后台任务功能
- **影响**: 这个修复对iOS用户的后台功能至关重要

## 提交信息

fix(ios-background): 修复iOS后台任务无法自动运行的问题

主要修复内容:
- 修复BackgroundTaskBridge任务调度逻辑,改用BGAppRefreshTaskRequest
- 添加任务完成后自动重新调度机制,确保任务持续执行
- 优化应用生命周期管理,移除重复的后台任务调度
- 在应用启动时添加后台任务状态检查和恢复功能
- 将默认任务间隔从30分钟优化为15分钟

次要改进:
- 重构日志系统,添加内存队列和批量写入机制,提升性能
- 添加写入锁和重试机制,防止日志数据丢失
- 新增详细的修复总结文档和测试指南

技术细节:
- 使用BGAppRefreshTaskRequest替代BGProcessingTaskRequest
- 实现任务过期自动重新调度
- 添加任务执行状态监控和恢复逻辑
- 优化错误处理和日志输出

影响范围: iOS后台任务调度、通知推送、应用状态管理
This commit is contained in:
richarjiang
2025-11-04 19:14:53 +08:00
parent f80a1bae78
commit d74046498d
8 changed files with 1014 additions and 102 deletions

View File

@@ -123,8 +123,15 @@ function Bootstrapper({ children }: { children: React.ReactNode }) {
const initializeNotifications = async () => {
try {
try {
logger.info('初始化后台任务管理器...');
await BackgroundTaskManager.getInstance().initialize();
logger.info('后台任务管理器初始化成功');
// 检查后台任务状态并恢复
await checkAndRestoreBackgroundTasks();
// 在开发环境中初始化调试工具
if (__DEV__) {
BackgroundTaskDebugger.getInstance().initialize();
@@ -215,6 +222,43 @@ function Bootstrapper({ children }: { children: React.ReactNode }) {
}
};
// 检查并恢复后台任务
const checkAndRestoreBackgroundTasks = async () => {
try {
const taskManager = BackgroundTaskManager.getInstance();
const status = await taskManager.getStatus();
const statusText = await taskManager.checkStatus();
logger.info(`后台任务状态检查: ${status} (${statusText})`);
// 检查是否有待处理的任务请求
const pendingRequests = await taskManager.getPendingRequests();
logger.info(`当前待处理的任务请求数量: ${pendingRequests.length}`);
// 如果没有待处理的任务请求,且状态可用,则调度一个新任务
if (pendingRequests.length === 0 && status === 'available') {
logger.info('没有待处理的任务请求,调度新的后台任务');
await taskManager.scheduleNextTask();
}
// 检查上次后台任务执行时间
const lastCheckTime = await taskManager.getLastBackgroundCheckTime();
if (lastCheckTime) {
const timeSinceLastCheck = Date.now() - lastCheckTime;
const hoursSinceLastCheck = timeSinceLastCheck / (1000 * 60 * 60);
logger.info(`上次后台任务执行时间: ${new Date(lastCheckTime).toLocaleString()} (${hoursSinceLastCheck.toFixed(1)}小时前)`);
// 如果超过24小时没有执行后台任务可能需要手动触发一次
if (hoursSinceLastCheck > 24) {
logger.warn('超过24小时未执行后台任务可能需要检查系统设置');
}
}
} catch (error) {
logger.error('检查后台任务状态失败:', error);
}
};
loadUserData();
initHealthPermissions();
initializeNotifications();