feat: 支持新接口

This commit is contained in:
richarjiang
2025-09-18 16:27:11 +08:00
parent 6f0c872223
commit 2c382ab8de

View File

@@ -71,27 +71,27 @@ const createSleepDateRange = (date: Date): { startDate: Date; endDate: Date } =>
/** /**
* 映射 HealthKit 睡眠值到自定义枚举 * 映射 HealthKit 睡眠值到自定义枚举
* react-native-health 库返回的睡眠分析值是字符串: * HealthKit 原生模块返回的睡眠分析值:
* "INBED" = InBed (在床时间) * "inBed" = InBed (在床时间)
* "ASLEEP" = Asleep (睡着但未分阶段) * "asleep" = Asleep (睡着但未分阶段)
* "AWAKE" = Awake (醒来时间) * "awake" = Awake (醒来时间)
* "CORE" = Core (核心睡眠/浅度睡眠) * "core" = Core (核心睡眠/浅度睡眠)
* "DEEP" = Deep (深度睡眠) * "deep" = Deep (深度睡眠)
* "REM" = REM (快速眼动睡眠) * "rem" = REM (快速眼动睡眠)
*/ */
const mapHealthKitSleepValue = (value: string): SleepStage => { const mapHealthKitSleepValue = (value: string): SleepStage => {
switch (value) { switch (value) {
case 'INBED': case 'inBed':
return SleepStage.InBed; return SleepStage.InBed;
case 'ASLEEP': case 'asleep':
return SleepStage.Asleep; return SleepStage.Asleep;
case 'AWAKE': case 'awake':
return SleepStage.Awake; return SleepStage.Awake;
case 'CORE': case 'core':
return SleepStage.Core; return SleepStage.Core;
case 'DEEP': case 'deep':
return SleepStage.Deep; return SleepStage.Deep;
case 'REM': case 'rem':
return SleepStage.REM; return SleepStage.REM;
default: default:
console.warn(`[Sleep] 未识别的睡眠阶段值: ${value}`); console.warn(`[Sleep] 未识别的睡眠阶段值: ${value}`);
@@ -115,54 +115,45 @@ export const fetchSleepSamples = async (date: Date): Promise<SleepSample[]> => {
endDate: dateRange.endDate.toISOString(), endDate: dateRange.endDate.toISOString(),
}; };
// return new Promise((resolve) => { const result = await HealthKitManager.getSleepData(options);
// HealthKitManager.(options, (error: string, results: any[]) => {
// if (error) {
// console.error('[Sleep] 获取睡眠数据失败:', error);
// resolve([]); // 返回空数组而非拒绝,以便于处理
// return;
// }
// if (!results || results.length === 0) { if (!result.data || result.data.length === 0) {
// console.warn('[Sleep] 未找到睡眠数据'); console.warn('[Sleep] 未找到睡眠数据');
// resolve([]); return [];
// return; }
// }
// console.log('[Sleep] 获取到原始睡眠样本:', results.length, '条'); console.log('[Sleep] 获取到原始睡眠样本:', result.data.length, '条');
// // 过滤并转换数据格式 // 过滤并转换数据格式
// const sleepSamples: SleepSample[] = results const sleepSamples: SleepSample[] = result.data
// .filter(sample => { .filter(sample => {
// const sampleStart = new Date(sample.startDate).getTime(); const sampleStart = new Date(sample.startDate).getTime();
// const sampleEnd = new Date(sample.endDate).getTime(); const sampleEnd = new Date(sample.endDate).getTime();
// const rangeStart = dateRange.startDate.getTime(); const rangeStart = dateRange.startDate.getTime();
// const rangeEnd = dateRange.endDate.getTime(); const rangeEnd = dateRange.endDate.getTime();
// return (sampleStart >= rangeStart && sampleStart < rangeEnd) || return (sampleStart >= rangeStart && sampleStart < rangeEnd) ||
// (sampleStart < rangeEnd && sampleEnd > rangeStart); (sampleStart < rangeEnd && sampleEnd > rangeStart);
// }) })
// .map(sample => { .map(sample => {
// console.log('[Sleep] 原始睡眠样本:', { console.log('[Sleep] 原始睡眠样本:', {
// startDate: sample.startDate, startDate: sample.startDate,
// endDate: sample.endDate, endDate: sample.endDate,
// value: sample.value, categoryType: sample.categoryType,
// sourceName: sample.sourceName source: sample.source.name
// }); });
// return { return {
// startDate: sample.startDate, startDate: sample.startDate,
// endDate: sample.endDate, endDate: sample.endDate,
// value: mapHealthKitSleepValue(sample.value), value: mapHealthKitSleepValue(sample.categoryType),
// sourceName: sample.sourceName, sourceName: sample.source.name,
// sourceId: sample.sourceId || sample.uuid sourceId: sample.id
// }; };
// }); });
// console.log('[Sleep] 过滤后的睡眠样本:', sleepSamples.length, '条'); console.log('[Sleep] 过滤后的睡眠样本:', sleepSamples.length, '条');
// resolve(sleepSamples); return sleepSamples;
// });
// });
} catch (error) { } catch (error) {
console.error('[Sleep] 获取睡眠样本失败:', error); console.error('[Sleep] 获取睡眠样本失败:', error);
@@ -173,12 +164,10 @@ export const fetchSleepSamples = async (date: Date): Promise<SleepSample[]> => {
/** /**
* 获取睡眠期间心率数据 * 获取睡眠期间心率数据
*/ */
export const fetchSleepHeartRateData = async (bedtime: string, wakeupTime: string): Promise<HeartRateData[]> => { export const fetchSleepHeartRateData = async (): Promise<HeartRateData[]> => {
try { try {
const options = { // 暂时返回空数组,因为心率数据获取功能被注释掉了
startDate: bedtime, return [];
endDate: wakeupTime,
};
// return new Promise((resolve) => { // return new Promise((resolve) => {
// HealthKit.getHeartRateSamples(options, (error: string, results: any[]) => { // HealthKit.getHeartRateSamples(options, (error: string, results: any[]) => {
@@ -374,7 +363,7 @@ export const fetchCompleteSleepData = async (date: Date): Promise<CompleteSleepD
return null; return null;
} }
const res = await HealthKitManager.requestAuthorization() await HealthKitManager.requestAuthorization()
const status = await HealthKitManager.getAuthorizationStatus() const status = await HealthKitManager.getAuthorizationStatus()
console.log('status~~~', status); console.log('status~~~', status);
// await ensureHealthPermissions() // await ensureHealthPermissions()
@@ -435,7 +424,7 @@ export const fetchCompleteSleepData = async (date: Date): Promise<CompleteSleepD
console.log('- 睡眠效率:', sleepEfficiency, '%'); console.log('- 睡眠效率:', sleepEfficiency, '%');
// 获取睡眠期间心率数据 // 获取睡眠期间心率数据
const sleepHeartRateData = await fetchSleepHeartRateData(bedtime, wakeupTime); const sleepHeartRateData = await fetchSleepHeartRateData();
const averageHeartRate = sleepHeartRateData.length > 0 ? const averageHeartRate = sleepHeartRateData.length > 0 ?
Math.round(sleepHeartRateData.reduce((sum, data) => sum + data.value, 0) / sleepHeartRateData.length) : Math.round(sleepHeartRateData.reduce((sum, data) => sum + data.value, 0) / sleepHeartRateData.length) :
null; null;