feat: 支持新接口
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user