From 2c382ab8def0475c25c11a2529cbdd2ebbf45104 Mon Sep 17 00:00:00 2001 From: richarjiang Date: Thu, 18 Sep 2025 16:27:11 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E6=96=B0=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/sleepHealthKit.ts | 113 ++++++++++++++++++---------------------- 1 file changed, 51 insertions(+), 62 deletions(-) diff --git a/utils/sleepHealthKit.ts b/utils/sleepHealthKit.ts index 4794f3a..6f7ce03 100644 --- a/utils/sleepHealthKit.ts +++ b/utils/sleepHealthKit.ts @@ -71,27 +71,27 @@ const createSleepDateRange = (date: Date): { startDate: Date; endDate: Date } => /** * 映射 HealthKit 睡眠值到自定义枚举 - * react-native-health 库返回的睡眠分析值是字符串: - * "INBED" = InBed (在床时间) - * "ASLEEP" = Asleep (睡着但未分阶段) - * "AWAKE" = Awake (醒来时间) - * "CORE" = Core (核心睡眠/浅度睡眠) - * "DEEP" = Deep (深度睡眠) - * "REM" = REM (快速眼动睡眠) + * HealthKit 原生模块返回的睡眠分析值: + * "inBed" = InBed (在床时间) + * "asleep" = Asleep (睡着但未分阶段) + * "awake" = Awake (醒来时间) + * "core" = Core (核心睡眠/浅度睡眠) + * "deep" = Deep (深度睡眠) + * "rem" = REM (快速眼动睡眠) */ const mapHealthKitSleepValue = (value: string): SleepStage => { switch (value) { - case 'INBED': + case 'inBed': return SleepStage.InBed; - case 'ASLEEP': + case 'asleep': return SleepStage.Asleep; - case 'AWAKE': + case 'awake': return SleepStage.Awake; - case 'CORE': + case 'core': return SleepStage.Core; - case 'DEEP': + case 'deep': return SleepStage.Deep; - case 'REM': + case 'rem': return SleepStage.REM; default: console.warn(`[Sleep] 未识别的睡眠阶段值: ${value}`); @@ -115,54 +115,45 @@ export const fetchSleepSamples = async (date: Date): Promise => { endDate: dateRange.endDate.toISOString(), }; - // return new Promise((resolve) => { - // HealthKitManager.(options, (error: string, results: any[]) => { - // if (error) { - // console.error('[Sleep] 获取睡眠数据失败:', error); - // resolve([]); // 返回空数组而非拒绝,以便于处理 - // return; - // } + const result = await HealthKitManager.getSleepData(options); - // if (!results || results.length === 0) { - // console.warn('[Sleep] 未找到睡眠数据'); - // resolve([]); - // return; - // } + if (!result.data || result.data.length === 0) { + console.warn('[Sleep] 未找到睡眠数据'); + return []; + } - // console.log('[Sleep] 获取到原始睡眠样本:', results.length, '条'); + console.log('[Sleep] 获取到原始睡眠样本:', result.data.length, '条'); - // // 过滤并转换数据格式 - // const sleepSamples: SleepSample[] = results - // .filter(sample => { - // const sampleStart = new Date(sample.startDate).getTime(); - // const sampleEnd = new Date(sample.endDate).getTime(); - // const rangeStart = dateRange.startDate.getTime(); - // const rangeEnd = dateRange.endDate.getTime(); + // 过滤并转换数据格式 + const sleepSamples: SleepSample[] = result.data + .filter(sample => { + const sampleStart = new Date(sample.startDate).getTime(); + const sampleEnd = new Date(sample.endDate).getTime(); + const rangeStart = dateRange.startDate.getTime(); + const rangeEnd = dateRange.endDate.getTime(); - // return (sampleStart >= rangeStart && sampleStart < rangeEnd) || - // (sampleStart < rangeEnd && sampleEnd > rangeStart); - // }) - // .map(sample => { - // console.log('[Sleep] 原始睡眠样本:', { - // startDate: sample.startDate, - // endDate: sample.endDate, - // value: sample.value, - // sourceName: sample.sourceName - // }); + return (sampleStart >= rangeStart && sampleStart < rangeEnd) || + (sampleStart < rangeEnd && sampleEnd > rangeStart); + }) + .map(sample => { + console.log('[Sleep] 原始睡眠样本:', { + startDate: sample.startDate, + endDate: sample.endDate, + categoryType: sample.categoryType, + source: sample.source.name + }); - // return { - // startDate: sample.startDate, - // endDate: sample.endDate, - // value: mapHealthKitSleepValue(sample.value), - // sourceName: sample.sourceName, - // sourceId: sample.sourceId || sample.uuid - // }; - // }); + return { + startDate: sample.startDate, + endDate: sample.endDate, + value: mapHealthKitSleepValue(sample.categoryType), + sourceName: sample.source.name, + sourceId: sample.id + }; + }); - // console.log('[Sleep] 过滤后的睡眠样本:', sleepSamples.length, '条'); - // resolve(sleepSamples); - // }); - // }); + console.log('[Sleep] 过滤后的睡眠样本:', sleepSamples.length, '条'); + return sleepSamples; } catch (error) { console.error('[Sleep] 获取睡眠样本失败:', error); @@ -173,12 +164,10 @@ export const fetchSleepSamples = async (date: Date): Promise => { /** * 获取睡眠期间心率数据 */ -export const fetchSleepHeartRateData = async (bedtime: string, wakeupTime: string): Promise => { +export const fetchSleepHeartRateData = async (): Promise => { try { - const options = { - startDate: bedtime, - endDate: wakeupTime, - }; + // 暂时返回空数组,因为心率数据获取功能被注释掉了 + return []; // return new Promise((resolve) => { // HealthKit.getHeartRateSamples(options, (error: string, results: any[]) => { @@ -374,7 +363,7 @@ export const fetchCompleteSleepData = async (date: Date): Promise 0 ? Math.round(sleepHeartRateData.reduce((sum, data) => sum + data.value, 0) / sleepHeartRateData.length) : null;