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

Я ставлю точку останова на цикл for и на NSLog(@"error:%@", error), но приложение не ломается.

Кто-нибудь может помочь?


person Cokile Ceoi    schedule 04.04.2016    source источник
comment
Вы не проверяли параметры ошибки? Вы просматриваете results: %lu журнал? Я не уверен, что вам следует stopQuery:. Кажется странным.   -  person Larme    schedule 04.04.2016
comment
@Larme Я также проверил error, но NSLog(@"error:%@", error) ничего не записал.   -  person Cokile Ceoi    schedule 04.04.2016


Ответы (2)


Ваш код немедленно останавливает запрос, прежде чем он сможет запуститься. Для этого запроса вообще нет причин вызывать stopQuery:, если только вы не хотите отменить запрос до его завершения. Поскольку запрос недолговечен (у него нет updateHandler), он остановится сразу после вызова resultsHandler.

Вторая проблема заключается в том, что ваш код пытается зарегистрировать количество шагов слишком рано. Запрос выполняется асинхронно, и resultsHandler будет вызываться в фоновом потоке после завершения запроса. Я бы предложил записывать stepsCount внутри блока.

Наконец, если вы хотите подсчитать шаги пользователя, вы должны использовать HKStatisticsQuery вместо суммирования результатов HKSampleQuery. HKStatisticsQuery более эффективен и дает правильные результаты при наличии нескольких источников перекрывающихся данных в HealthKit. Ваша текущая реализация будет дважды подсчитывать шаги пользователя, например, если у него есть и iPhone, и Apple Watch.

person Allan    schedule 05.04.2016
comment
Работает, спасибо за ответ и совет! Я изменил HKSampleQuery на HKStatisticsQuery, и это действительно более эффективно, но оно не может обновлять шаги в реальном времени, результат запроса обновляется только при открытии приложения «Здоровье». - person Cokile Ceoi; 06.04.2016

Попробуйте этот код, просто измените дату начала и дату окончания.

-(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];
}
person Nil Rathod    schedule 15.09.2016