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 睡眠值到自定义枚举
* 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<SleepSample[]> => {
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<SleepSample[]> => {
/**
* 获取睡眠期间心率数据
*/
export const fetchSleepHeartRateData = async (bedtime: string, wakeupTime: string): Promise<HeartRateData[]> => {
export const fetchSleepHeartRateData = async (): Promise<HeartRateData[]> => {
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<CompleteSleepD
return null;
}
const res = await HealthKitManager.requestAuthorization()
await HealthKitManager.requestAuthorization()
const status = await HealthKitManager.getAuthorizationStatus()
console.log('status~~~', status);
// await ensureHealthPermissions()
@@ -435,7 +424,7 @@ export const fetchCompleteSleepData = async (date: Date): Promise<CompleteSleepD
console.log('- 睡眠效率:', sleepEfficiency, '%');
// 获取睡眠期间心率数据
const sleepHeartRateData = await fetchSleepHeartRateData(bedtime, wakeupTime);
const sleepHeartRateData = await fetchSleepHeartRateData();
const averageHeartRate = sleepHeartRateData.length > 0 ?
Math.round(sleepHeartRateData.reduce((sum, data) => sum + data.value, 0) / sleepHeartRateData.length) :
null;