2016-04-04 8 views
0

Я работаю с HealthKit, чтобы читать данные шагов с моего устройства iOS.HealthKit не может считывать данные шагов

вот мой код:

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), но приложение не ломается.

Любой может помочь?

+0

Вы не указали параметры ошибки? Переходите ли вы к результатам:% lu' log? Я не уверен, что вам нужно «stopQuery:». Кажется странным. – Larme

+0

@ Larme Я также проверил 'error', но 'NSLog (@" error:% @ ", ошибка)' ничего не записывал. – CokileCeoi

ответ

1

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

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

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

+0

Это работает, спасибо за ваш ответ и совет! Я изменил 'HKSampleQuery' на' HKStatisticsQuery', и он действительно более эффективен, но он не может обновлять шаги в реальном времени, результат обновления запроса только при открытии приложения «Здоровье». – CokileCeoi

2

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

-(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]; 
} 
+0

Этот код намного проще и возвращает точные данные. –