feat: 添加后台任务调试工具并优化水提醒任务逻辑

This commit is contained in:
richarjiang
2025-11-03 10:55:30 +08:00
parent 16c2351160
commit 0265ecfac2
6 changed files with 424 additions and 70 deletions

View File

@@ -20,7 +20,7 @@ import { fetchMyProfile, setPrivacyAgreed } from '@/store/userSlice';
import { createWaterRecordAction } from '@/store/waterSlice';
import { loadActiveFastingSchedule } from '@/utils/fasting';
import { ensureHealthPermissions, initializeHealthPermissions } from '@/utils/health';
import { MoodNotificationHelpers, NutritionNotificationHelpers } from '@/utils/notificationHelpers';
import { MoodNotificationHelpers, NutritionNotificationHelpers, WaterNotificationHelpers } from '@/utils/notificationHelpers';
import { clearPendingWaterRecords, syncPendingWidgetChanges } from '@/utils/widgetDataSync';
import React, { useEffect } from 'react';
@@ -32,8 +32,20 @@ import { STORAGE_KEYS } from '@/services/api';
import { BackgroundTaskManager } from '@/services/backgroundTaskManager';
import { fetchChallenges } from '@/store/challengesSlice';
import AsyncStorage from '@/utils/kvStore';
import { logger } from '@/utils/logger';
import { Provider } from 'react-redux';
// 在开发环境中导入调试工具
let BackgroundTaskDebugger: any = null;
if (__DEV__) {
try {
const debuggerModule = require('@/services/backgroundTaskDebugger');
BackgroundTaskDebugger = debuggerModule.BackgroundTaskDebugger;
} catch (error) {
logger.warn('无法导入后台任务调试工具:', error);
}
}
function Bootstrapper({ children }: { children: React.ReactNode }) {
const dispatch = useAppDispatch();
@@ -63,7 +75,7 @@ function Bootstrapper({ children }: { children: React.ReactNode }) {
if (store.getState().fasting.activeSchedule) return;
dispatch(hydrateActiveSchedule(stored));
} catch (error) {
console.warn('恢复断食计划失败:', error);
logger.warn('恢复断食计划失败:', error);
}
};
@@ -89,60 +101,75 @@ function Bootstrapper({ children }: { children: React.ReactNode }) {
const initHealthPermissions = async () => {
// 初始化 HealthKit 权限管理系统
try {
console.log('初始化 HealthKit 权限管理系统...');
logger.info('初始化 HealthKit 权限管理系统...');
initializeHealthPermissions();
// 延迟请求权限,避免应用启动时弹窗
setTimeout(async () => {
try {
await ensureHealthPermissions();
console.log('HealthKit 权限请求完成');
logger.info('HealthKit 权限请求完成');
} catch (error) {
console.warn('HealthKit 权限请求失败,可能在模拟器上运行:', error);
logger.warn('HealthKit 权限请求失败,可能在模拟器上运行:', error);
}
}, 2000);
console.log('HealthKit 权限管理初始化完成');
logger.info('HealthKit 权限管理初始化完成');
} catch (error) {
console.warn('HealthKit 权限管理初始化失败:', error);
logger.warn('HealthKit 权限管理初始化失败:', error);
}
}
const initializeNotifications = async () => {
try {
await BackgroundTaskManager.getInstance().initialize();
try {
await BackgroundTaskManager.getInstance().initialize();
// 在开发环境中初始化调试工具
if (__DEV__) {
BackgroundTaskDebugger.getInstance().initialize();
logger.info('后台任务调试工具已初始化(开发环境)');
}
} catch (backgroundError) {
logger.error('后台任务管理器初始化失败,将跳过后台任务:', backgroundError);
}
// 初始化通知服务
await notificationService.initialize();
console.log('通知服务初始化成功');
logger.info('通知服务初始化成功');
// 注册午餐提醒12:00
await NutritionNotificationHelpers.scheduleDailyLunchReminder(profile.name || '');
console.log('午餐提醒已注册');
logger.info('午餐提醒已注册');
// 注册晚餐提醒18:00
await NutritionNotificationHelpers.scheduleDailyDinnerReminder(profile.name || '');
console.log('晚餐提醒已注册');
logger.info('晚餐提醒已注册');
// 注册心情提醒21:00
await MoodNotificationHelpers.scheduleDailyMoodReminder(profile.name || '');
console.log('心情提醒已注册');
logger.info('心情提醒已注册');
// 注册默认喝水提醒9:00-21:00每2小时一次
await WaterNotificationHelpers.scheduleRegularWaterReminders(profile.name || '用户');
logger.info('默认喝水提醒已注册');
// 初始化快捷动作
await setupQuickActions();
console.log('快捷动作初始化成功');
logger.info('快捷动作初始化成功');
// 初始化喝水记录 bridge
initializeWaterRecordBridge();
console.log('喝水记录 Bridge 初始化成功');
logger.info('喝水记录 Bridge 初始化成功');
// 初始化锻炼监听服务
const initializeWorkoutMonitoring = async () => {
try {
await workoutMonitorService.initialize();
console.log('锻炼监听服务初始化成功');
logger.info('锻炼监听服务初始化成功');
} catch (error) {
console.warn('锻炼监听服务初始化失败:', error);
logger.warn('锻炼监听服务初始化失败:', error);
}
};
@@ -151,7 +178,7 @@ function Bootstrapper({ children }: { children: React.ReactNode }) {
// 检查并同步Widget数据更改
const widgetSync = await syncPendingWidgetChanges();
if (widgetSync.hasPendingChanges && widgetSync.pendingRecords) {
console.log(`检测到 ${widgetSync.pendingRecords.length} 条待同步的水记录`);
logger.info(`检测到 ${widgetSync.pendingRecords.length} 条待同步的水记录`);
// 将待同步的记录添加到 Redux store
for (const record of widgetSync.pendingRecords) {
@@ -162,18 +189,18 @@ function Bootstrapper({ children }: { children: React.ReactNode }) {
source: WaterRecordSource.Auto, // 标记为自动添加来自Widget
})).unwrap();
console.log(`成功同步水记录: ${record.amount}ml at ${record.recordedAt}`);
logger.info(`成功同步水记录: ${record.amount}ml at ${record.recordedAt}`);
} catch (error) {
console.error('同步水记录失败:', error);
logger.error('同步水记录失败:', error);
}
}
// 清除已同步的记录
await clearPendingWaterRecords();
console.log('所有待同步的水记录已处理完成');
logger.info('所有待同步的水记录已处理完成');
}
} catch (error) {
console.error('通知服务、后台任务管理器或快捷动作初始化失败:', error);
logger.error('通知服务、后台任务管理器或快捷动作初始化失败:', error);
}
};