HealthKit не может прочитать данные шагов
Я работаю с HealthKit, чтобы прочитать данные о шагах с моего устройства iOS.
вот мой код:
if ([HKHealthStore isHealthDataAvailable]) {
__block double stepsCount = 0.0;
self.healthStore = [[HKHealthStore alloc] init];
NSSet *stepsType =[NSSet setWithObject:[HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount]];
[self.healthStore requestAuthorizationToShareTypes:nil readTypes:stepsType completion:^(BOOL success, NSError * _Nullable error) {
if (success) {
HKSampleType *sampleType = [HKSampleType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount];
HKSampleQuery *sampleQuery = [[HKSampleQuery alloc] initWithSampleType:sampleType predicate:nil limit:HKObjectQueryNoLimit sortDescriptors:nil resultsHandler:^(HKSampleQuery *query, NSArray *results, NSError *error) {
if (error != nil) {
NSLog(@"results: %lu", (unsigned long)[results count]);
for (HKQuantitySample *result in results) {
stepsCount += [result.quantity doubleValueForUnit:[HKUnit countUnit]];
}
NSLog(@"Steps Count: %f", stepsCount);
} else {
NSLog(@"error:%@", error);
}];
[self.healthStore executeQuery:sampleQuery];
[self.healthStore stopQuery:sampleQuery];
NSLog(@"steps:%f",stepsCount);
}
}];
}
Я создаю и запускаю код на iPhone6, который имеет данные шагов, и в Настройках -> Конфиденциальность -> Здоровье приложению разрешено считывать данные, но в области журнала отображаются только:
steps:0.000000
Я ставлю точку останова на цикл и на NSLog(@"error:%@", error)
, но приложение не ломается.
Кто-нибудь может помочь?
2 ответа
Ваш код немедленно останавливает запрос, прежде чем он сможет выполнить. По этому запросу нет причин звонить stopQuery:
вообще, если вы не хотите отменить запрос до его завершения. Поскольку запрос не является долгоживущим (у него нет updateHandler
), он остановится сразу после resultsHandler
называется.
Вторая проблема заключается в том, что ваш код пытается зарегистрировать количество шагов слишком рано. Запрос выполняется асинхронно, и resultsHandler
будет вызван в фоновом потоке после завершения запроса. Я бы предложил войти stepsCount
внутри блока.
Наконец, если вы хотите посчитать шаги пользователя, вы должны нам HKStatisticsQuery
вместо суммирования результатов HKSampleQuery
, HKStatisticsQuery
является более эффективным и даст правильные результаты, если в HealthKit есть несколько источников перекрывающихся данных. Ваша текущая реализация, например, удвоит количество шагов пользователя, если у него есть iPhone и Apple Watch.
Попробуйте этот код, просто измените дату начала и дату окончания.
-(void) getQuantityResult
{
NSInteger limit = 0;
NSPredicate *predicate = [HKQuery predicateForSamplesWithStartDate:currentDate endDate:[[NSDate date]dateByAddingTimeInterval:60*60*24*3] options:HKQueryOptionStrictStartDate];
NSString *endKey = HKSampleSortIdentifierEndDate;
NSSortDescriptor *endDate = [NSSortDescriptor sortDescriptorWithKey: endKey ascending: NO];
HKSampleQuery *query = [[HKSampleQuery alloc] initWithSampleType[HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount]
predicate: predicate
limit: limit
sortDescriptors: @[endDate]
resultsHandler:^(HKSampleQuery *query, NSArray* results, NSError *error){
dispatch_async(dispatch_get_main_queue(), ^{
// sends the data using HTTP
int dailyAVG = 0;
for(HKQuantitySample *samples in results)
{
dailyAVG += [[samples quantity] doubleValueForUnit:[HKUnit countUnit]];
}
lblPrint.text = [NSString stringWithFormat:@"%d",dailyAVG];
NSLog(@"%@",lblPrint.text);
NSLog(@"%@",@"Done");
});
}];
[self.healthStore executeQuery:query];
}