我正在做一个应用程序,该应用程序从Apple HealthKit读取每日步骤和睡眠数据。如何使用Apple HealthKit获得每日睡眠时间?
对于步骤,这是很容易的,因为它是一个HKQuantityType
,这样我就可以把它应用HKStatisticsOptionCumulativeSum
选项。将开始日期,结束日期和日期时间间隔放在中,并且您已得到它。
- (void)readDailyStepsSince:(NSDate *)date completion:(void (^)(NSArray *results, NSError *error))completion {
NSDate *today = [NSDate date];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *comps = [calendar components:NSCalendarUnitDay|NSCalendarUnitMonth|NSCalendarUnitYear fromDate:date];
comps.hour = 0;
comps.minute = 0;
comps.second = 0;
NSDate *midnightOfStartDate = [calendar dateFromComponents:comps];
NSDate *anchorDate = midnightOfStartDate;
HKQuantityType *stepType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount];
HKStatisticsOptions sumOptions = HKStatisticsOptionCumulativeSum;
NSPredicate *dateRangePred = [HKQuery predicateForSamplesWithStartDate:midnightOfStartDate endDate:today options:HKQueryOptionNone];
NSDateComponents *interval = [[NSDateComponents alloc] init];
interval.day = 1;
HKStatisticsCollectionQuery *query = [[HKStatisticsCollectionQuery alloc] initWithQuantityType:stepType quantitySamplePredicate:dateRangePred options:sumOptions anchorDate:anchorDate intervalComponents:interval];
query.initialResultsHandler = ^(HKStatisticsCollectionQuery *query, HKStatisticsCollection *result, NSError *error) {
NSMutableArray *output = [NSMutableArray array];
// we want "populated" statistics only, so we use result.statistics to iterate
for (HKStatistics *sample in result.statistics) {
double steps = [sample.sumQuantity doubleValueForUnit:[HKUnit countUnit]];
NSDictionary *dict = @{@"date": sample.startDate, @"steps": @(steps)};
//NSLog(@"[STEP] date:%@ steps:%.0f", s.startDate, steps);
[output addObject:dict];
}
dispatch_async(dispatch_get_main_queue(), ^{
if (completion != nil) {
NSLog(@"[STEP] %@", output);
completion(output, error);
}
});
};
[self.healthStore executeQuery:query];
}
但睡眠它不是那么简单。我坚持着很多东西。
- 首先,与步骤不同,sleep是一个
HKCategoryType
。所以我们不能用HKStatisticsCollectionQuery
来总结它,因为这个方法只接受HKQuantityType
。 - 此外还有2种价值类型的睡眠,
HKCategoryValueSleepAnalysisInBed
和HKCategoryValueSleepAnalysisAsleep
。我不确定哪个价值最适合睡眠时间。我只是为了简单起见而使用HKCategoryValueSleepAnalysisAsleep
。 - 睡眠数据出现在
HKCategorySample
对象的数组中。每个都有开始日期和结束日期。我如何有效地合并这些数据,在一天内修剪它,并从中获得每日睡眠时间(以分钟为单位)?我发现这DTTimePeriodCollection类在DateTool荚可能做这项工作,但我还没有弄明白。
简而言之,如果有人知道如何使用Apple HealthKit获得每日睡眠时间,请告诉我!
嗨,你有没有找到任何解决办法? –
你有没有找到睡眠时间的解决方案? –