feat: 添加后台任务调试工具并优化水提醒任务逻辑
This commit is contained in:
@@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user