feat(initialize): 优化权限和健康监听服务的初始化流程,增加延迟和错误处理
fix(version): 更新应用版本号至1.0.26 feat(sleep): 增加睡眠阶段统计的准确性,优化日志输出
This commit is contained in:
@@ -6,6 +6,9 @@ import { analyzeWorkoutAndSendNotification } from './workoutNotificationService'
|
||||
const { HealthKitManager } = NativeModules;
|
||||
const workoutEmitter = new NativeEventEmitter(HealthKitManager);
|
||||
|
||||
const INITIAL_LOOKBACK_WINDOW_MS = 24 * 60 * 60 * 1000; // 24小时
|
||||
const DEFAULT_LOOKBACK_WINDOW_MS = 12 * 60 * 60 * 1000; // 12小时
|
||||
|
||||
class WorkoutMonitorService {
|
||||
private static instance: WorkoutMonitorService;
|
||||
private isInitialized = false;
|
||||
@@ -111,32 +114,57 @@ class WorkoutMonitorService {
|
||||
try {
|
||||
console.log('检查新的锻炼记录...');
|
||||
|
||||
// 获取最近1小时的锻炼记录
|
||||
const oneHourAgo = new Date(Date.now() - 60 * 60 * 1000);
|
||||
const lookbackWindowMs = this.lastProcessedWorkoutId
|
||||
? DEFAULT_LOOKBACK_WINDOW_MS
|
||||
: INITIAL_LOOKBACK_WINDOW_MS;
|
||||
const startDate = new Date(Date.now() - lookbackWindowMs);
|
||||
const endDate = new Date();
|
||||
|
||||
console.log(
|
||||
`锻炼查询窗口: ${Math.round(lookbackWindowMs / (1000 * 60 * 60))} 小时 (${startDate.toISOString()} - ${endDate.toISOString()})`
|
||||
);
|
||||
|
||||
const recentWorkouts = await fetchRecentWorkouts({
|
||||
startDate: oneHourAgo.toISOString(),
|
||||
endDate: new Date().toISOString(),
|
||||
startDate: startDate.toISOString(),
|
||||
endDate: endDate.toISOString(),
|
||||
limit: 10
|
||||
});
|
||||
|
||||
console.log(`找到 ${recentWorkouts.length} 条最近的锻炼记录`);
|
||||
|
||||
// 检查是否有新的锻炼记录
|
||||
for (const workout of recentWorkouts) {
|
||||
if (workout.id !== this.lastProcessedWorkoutId) {
|
||||
console.log('检测到新锻炼:', {
|
||||
id: workout.id,
|
||||
type: workout.workoutActivityTypeString,
|
||||
duration: workout.duration,
|
||||
startDate: workout.startDate
|
||||
});
|
||||
|
||||
await this.processNewWorkout(workout);
|
||||
await this.saveLastProcessedWorkoutId(workout.id);
|
||||
} else {
|
||||
console.log('锻炼已处理过,跳过:', workout.id);
|
||||
}
|
||||
if (this.lastProcessedWorkoutId && !recentWorkouts.some(workout => workout.id === this.lastProcessedWorkoutId)) {
|
||||
console.warn('上次处理的锻炼记录不在当前查询窗口内,可能存在漏报风险');
|
||||
}
|
||||
|
||||
const newWorkouts: WorkoutData[] = [];
|
||||
for (const workout of recentWorkouts) {
|
||||
if (workout.id === this.lastProcessedWorkoutId) {
|
||||
break;
|
||||
}
|
||||
newWorkouts.push(workout);
|
||||
}
|
||||
|
||||
if (newWorkouts.length === 0) {
|
||||
console.log('没有检测到新的锻炼记录');
|
||||
return;
|
||||
}
|
||||
|
||||
console.log(`检测到 ${newWorkouts.length} 条新的锻炼记录,将按时间顺序处理`);
|
||||
|
||||
// 先处理最旧的锻炼,确保通知顺序正确
|
||||
for (const workout of newWorkouts.reverse()) {
|
||||
console.log('处理新锻炼:', {
|
||||
id: workout.id,
|
||||
type: workout.workoutActivityTypeString,
|
||||
duration: workout.duration,
|
||||
startDate: workout.startDate
|
||||
});
|
||||
|
||||
await this.processNewWorkout(workout);
|
||||
}
|
||||
|
||||
await this.saveLastProcessedWorkoutId(newWorkouts[0].id);
|
||||
console.log('锻炼处理完成,最新处理的锻炼ID:', newWorkouts[0].id);
|
||||
} catch (error) {
|
||||
console.error('检查新锻炼失败:', error);
|
||||
}
|
||||
@@ -170,4 +198,4 @@ class WorkoutMonitorService {
|
||||
}
|
||||
}
|
||||
|
||||
export const workoutMonitorService = WorkoutMonitorService.getInstance();
|
||||
export const workoutMonitorService = WorkoutMonitorService.getInstance();
|
||||
|
||||
Reference in New Issue
Block a user