2016-04-04 18 views
0

iOS aygıtımdaki adım verilerini okumak için HealthKit ile çalışıyorum. > Gizlilik - -> Sağlık, uygulama verilerini okumak için izin verilmiş olması geliyor ben oluşturmak ve adımlar veri var bir iPhone6 ​​üzerinde kod çalıştırmasına ve Ayarlar bölümündeHealthKit, adım verilerini okuyamadı

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); 
      } 
     }]; 
    } 

: Burada

benim kodudur
steps:0.000000 

Ben-döngü ve NSLog(@"error:%@", error) bir kesme noktası koymak, ancak uygulamanın sonu yok: ancak günlük alanı yalnızca gösterir.

Herkes yardımcı olabilir?

+0

Hata parametrelerini kontrol etmediniz mi? Sonuçlardan geçiyor musunuz:% lu' log? Eminim durmanız gereken yer burası değil. Garip görünüyor. – Larme

+0

@Larme Ayrıca 'error' kontrol ettim, ama 'NSLog (@ "error:% @", error) 'hiçbir şey kaydetmedim. – CokileCeoi

cevap

1

Kodunuz, çalıştırma şansı olmadan hemen sorguyu durdurur. Bu sorgu için, bitirmeden önce bir sorguyu iptal etmek istemediğiniz sürece stopQuery: numaralı telefonu aramak için hiçbir neden yoktur. Sorgu uzun ömürlü olmadığından (updateHandler yok), resultsHandler çağrıldıktan hemen sonra duracaktır.

İkinci sorun, kodunuzun çok yakında adım sayısını kaydetmeye çalıştığıdır. Sorguyu eşzamansız olarak çalıştırır ve sorgu tamamlandığında resultsHandler bir arka plan iş parçacığı üzerinde çağrılır. Bloğun içinde stepsCount kaydını tutmayı öneririm.

Son olarak, kullanıcının adımlarını saymak isterseniz, HKSampleQuery sonuçlarını toplamak yerine HKStatisticsQuery bize bildirmelisiniz. HKStatisticsQuery, daha etkilidir ve HealthKit'te birden fazla örtüşen veri kaynağı olduğunda doğru sonuçları verir. Örneğin, hem iPhone'unuz hem de Apple Watch'ınız varsa, mevcut uygulamanızın kullanıcı adımlarını ikiye katlayacaktır.

+0

Çalışıyor, Cevabınız ve tavsiyeniz için teşekkürler! HKSampleQuery'yi 'HKStatisticsQuery' olarak değiştirdim ve gerçekten daha verimli, ancak adımları gerçek zamanlı olarak güncelleyemiyor, sorgu sonucu yalnızca Sağlık uygulamasını açtığımda güncellenir. – CokileCeoi

2

Bu kodu deneyin, sadece başlangıç ​​tarihini ve Bitiş tarihini değiştirin.

-(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

Bu Kod çok daha kolay ve tam veri döndü .. –

İlgili konular