feat: 支持将饮水记录同步到 HealthKit,新增相关功能和权限设置

This commit is contained in:
richarjiang
2025-09-03 08:42:48 +08:00
parent a70cb1e407
commit e33a690a36
2 changed files with 124 additions and 2 deletions

View File

@@ -19,10 +19,13 @@ const PERMISSIONS: HealthKitPermissions = {
AppleHealthKit.Constants.Permissions.ActivitySummary,
AppleHealthKit.Constants.Permissions.OxygenSaturation,
AppleHealthKit.Constants.Permissions.HeartRate,
AppleHealthKit.Constants.Permissions.Water,
],
write: [
// 支持体重写入
AppleHealthKit.Constants.Permissions.Weight,
// 支持饮水量写入
AppleHealthKit.Constants.Permissions.Water,
],
},
};
@@ -529,3 +532,59 @@ export async function testOxygenSaturationData(date: Date = dayjs().toDate()): P
});
});
}
// 添加饮水记录到 HealthKit
export async function saveWaterIntakeToHealthKit(amount: number, recordedAt?: string): Promise<boolean> {
return new Promise((resolve) => {
// HealthKit 水分摄入量使用升(L)作为单位,需要将毫升转换为升
const waterOptions = {
value: amount / 1000, // 将毫升转换为升 (ml -> L)
startDate: recordedAt ? new Date(recordedAt).toISOString() : new Date().toISOString(),
endDate: recordedAt ? new Date(recordedAt).toISOString() : new Date().toISOString(),
};
AppleHealthKit.saveWater(waterOptions, (error: Object, result: boolean) => {
if (error) {
console.error('添加饮水记录到 HealthKit 失败:', error);
resolve(false);
return;
}
console.log('成功添加饮水记录到 HealthKit:', {
originalAmount: amount,
convertedAmount: amount / 1000,
recordedAt,
result
});
resolve(true);
});
});
}
// 获取 HealthKit 中的饮水记录
export async function getWaterIntakeFromHealthKit(options: HealthDataOptions): Promise<any[]> {
return new Promise((resolve) => {
AppleHealthKit.getWaterSamples(options, (error: Object, results: any[]) => {
if (error) {
console.error('获取 HealthKit 饮水记录失败:', error);
resolve([]);
return;
}
console.log('从 HealthKit 获取饮水记录:', results);
resolve(results || []);
});
});
}
// 删除 HealthKit 中的饮水记录
// 注意: react-native-health 库可能不支持直接删除特定记录,这个功能可能需要手动实现或使用其他方法
export async function deleteWaterIntakeFromHealthKit(recordId: string, recordedAt: string): Promise<boolean> {
// HealthKit 通常不支持直接删除单条记录
// 这是一个占位函数,实际实现可能需要更复杂的逻辑
console.log('注意: HealthKit 通常不支持直接删除单条饮水记录');
console.log('记录信息:', { recordId, recordedAt });
// 返回 true 表示"成功"(但实际上可能没有真正删除)
return Promise.resolve(true);
}