feat(background): 增强iOS后台任务系统,添加processing任务类型支持

- 添加新的processing任务标识符到iOS配置文件
- 重构BackgroundTaskBridge支持不同任务类型(refresh/processing)
- 增强后台任务日志记录和调试信息
- 修复任务类型配置不匹配问题
- 改进任务调度逻辑和错误处理机制
- 添加任务执行时间戳记录用于调试
- 移除notification-settings中未使用的AuthGuard依赖
This commit is contained in:
richarjiang
2025-11-13 17:12:57 +08:00
parent 2dca3253e6
commit d282abd146
6 changed files with 129 additions and 26 deletions

View File

@@ -396,7 +396,7 @@ export class BackgroundTaskManagerV2 {
logger.info('[BackgroundTaskManagerV2] 配置后台任务...');
await NativeBackgroundModule.configure({
identifier: BACKGROUND_TASK_IDENTIFIER,
taskType: 'refresh',
taskType: 'processing', // 使用 processing 类型,与 Info.plist 中的配置匹配
requiresNetworkConnectivity: false,
requiresExternalPower: false,
defaultDelay: DEFAULT_RESCHEDULE_INTERVAL_SECONDS,
@@ -469,24 +469,43 @@ export class BackgroundTaskManagerV2 {
private async handleBackgroundExecution(): Promise<void> {
if (this.executingPromise) {
logger.info('[BackgroundTaskManagerV2] 已有后台任务在执行,忽略重复触发');
logger.warn('[BackgroundTaskManagerV2] ⚠️ 已有后台任务在执行,忽略重复触发');
return;
}
const startTime = Date.now();
logger.info('[BackgroundTaskManagerV2] 开始执行后台任务');
logger.info('[BackgroundTaskManagerV2] ===== 开始执行后台任务 =====');
logger.info(`[BackgroundTaskManagerV2] 执行时间: ${new Date().toLocaleString()}`);
logger.info('[BackgroundTaskManagerV2] 检查通知权限...');
// 记录任务开始时间
await AsyncStorage.setItem('@last_background_task_start', Date.now().toString());
this.executingPromise = executeBackgroundTasks()
.then(async () => {
const executionTime = Date.now() - startTime;
logger.info(`[BackgroundTaskManagerV2] 后台任务执行成功,耗时: ${executionTime}ms`);
logger.info(`[BackgroundTaskManagerV2] 后台任务执行成功,耗时: ${executionTime}ms`);
if (isIosBackgroundModuleAvailable) {
try {
// 确保任务完成前有足够的时间完成所有操作
logger.info('[BackgroundTaskManagerV2] 等待1秒确保所有操作完成...');
await new Promise(resolve => setTimeout(resolve, 1000)); // 等待1秒确保所有操作完成
await NativeBackgroundModule.complete(true, DEFAULT_RESCHEDULE_INTERVAL_SECONDS);
logger.info('[BackgroundTaskManagerV2] 已标记后台任务成功完成并重新调度');
logger.info('[BackgroundTaskManagerV2] 已标记后台任务成功完成并重新调度');
// 记录成功执行的时间戳
const successTime = Date.now();
await AsyncStorage.setItem('@last_background_execution_success', successTime.toString());
logger.info(`[BackgroundTaskManagerV2] ✅ 成功执行时间戳: ${new Date(successTime).toLocaleString()}`);
// 检查后台任务状态
const status = await this.getStatus();
const statusText = await this.checkStatus();
logger.info(`[BackgroundTaskManagerV2] 后台任务状态检查: ${status} (${statusText})`);
} catch (error) {
logger.error('[BackgroundTaskManagerV2] 标记后台任务成功完成失败', error);
logger.error('[BackgroundTaskManagerV2] 标记后台任务成功完成失败', error);
// 即使标记失败,也尝试手动重新调度
await this.scheduleNextTask();
}
@@ -494,14 +513,14 @@ export class BackgroundTaskManagerV2 {
})
.catch(async (error) => {
const executionTime = Date.now() - startTime;
logger.error(`[BackgroundTaskManagerV2] 后台任务执行失败,耗时: ${executionTime}ms`, error);
logger.error(`[BackgroundTaskManagerV2] 后台任务执行失败,耗时: ${executionTime}ms`, error);
if (isIosBackgroundModuleAvailable) {
try {
await NativeBackgroundModule.complete(false, DEFAULT_RESCHEDULE_INTERVAL_SECONDS);
logger.info('[BackgroundTaskManagerV2] 已标记后台任务失败并重新调度');
} catch (completionError) {
logger.error('[BackgroundTaskManagerV2] 标记后台任务失败状态时出错', completionError);
logger.error('[BackgroundTaskManagerV2] 标记后台任务失败状态时出错', completionError);
// 即使标记失败,也尝试手动重新调度
await this.scheduleNextTask();
}
@@ -509,6 +528,7 @@ export class BackgroundTaskManagerV2 {
})
.finally(() => {
this.executingPromise = null;
logger.info('[BackgroundTaskManagerV2] ===== 后台任务处理完成 =====');
});
await this.executingPromise;