2015-04-01 15 views

回答

0

您可以對要在後臺讀取的數據類型啓用後臺通知。 例如下面是使重量數據能夠後臺傳送的方法。您可以在didFinishLaunchingWithOptions方法中調用此方法。

- (無效){enableBackgroundDeliveryForQuantityType

HKQuantityType *weightType = [HKQuantityType quantityTypeForIdentifier: HKQuantityTypeIdentifierBodyMass]; 

[self.healthStore enableBackgroundDeliveryForType: weightType frequency: HKUpdateFrequencyImmediate withCompletion: ^(BOOL success, NSError *error) { 

    NSLog(@"***** Background notification called ................. %d", success); 
}]; 
HKObserverQuery *query = [[HKObserverQuery alloc] initWithSampleType: weightType predicate: nil updateHandler: ^(HKObserverQuery *query, HKObserverQueryCompletionHandler completionHandler, NSError *error) { 

    if(error) { 
     NSLog(@"Error.... %@", error.localizedDescription); 
     abort(); 
    } 
    NSLog(@"Weight data updated"); 

    [self yourCustomisedMethod: completionHandler]; 
}]; 

[self.healthStore executeQuery: query]; 

}

在成功的通知,您可以編寫自己的自定義方法,並調用它。

1

1.請求HealthKit授權:

- (void)checkHealthStoreAuthorization 
{ 
    if ([HKHealthStore isHealthDataAvailable]) { 
     NSSet *readDataTypes = [self dataTypesToRead]; 

     if (!self.healthStore) { 
      self.healthStore = [[HKHealthStore alloc] init]; 
     } 

     static NSInteger i = 0; 
     for (HKObjectType * quantityType in readDataTypes) { 
      if ([self.healthStore authorizationStatusForType:quantityType] == HKAuthorizationStatusNotDetermined) { 
       [self.healthStore requestAuthorizationToShareTypes:nil readTypes:readDataTypes completion:^(BOOL success, NSError *error) { 
        i++; 
        if (!success) { 
         if (error) { 
          NSLog(@"requestAuthorizationToShareTypes error: %@", error); 
         } 
         return; 
        } else { 
         if (i == [readDataTypes count]) { 
          static dispatch_once_t onceToken; 
          dispatch_once(&onceToken, ^{ 
           [self getHeight]; 
           [self getWeight]; 
          }); 
         } 
        } 
       }]; 
      } else { 
       if ([quantityType isEqual:[HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeight]]) { 
        [self getHeight]; 
       } else if ([quantityType isEqual:[HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierBodyMass]]) { 
        [self getWeight]; 
       } 
      } 
     } 
    } 
} 

- (NSSet *)dataTypesToRead 
{ 
    HKQuantityType *height = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeight]; 
    HKQuantityType *weight = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierBodyMass]; 
    return [NSSet setWithObjects:height, weight, nil]; 
} 

2.獲取身高和體重:

- (void)getHeight 
{ 
    NSDateComponents *interval = [[NSDateComponents alloc] init]; 
    interval.month = 1; 
    HKQuantityType *quantityType = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeight]; 

    HKStatisticsCollectionQuery *query = 
    [[HKStatisticsCollectionQuery alloc] initWithQuantityType:quantityType 
             quantitySamplePredicate:nil 
                 options:HKStatisticsOptionDiscreteAverage 
                anchorDate:[NSDate date] 
              intervalComponents:interval]; 

    query.initialResultsHandler = ^(HKStatisticsCollectionQuery *query, HKStatisticsCollection *results, NSError *error) { 
     if (error) { 
      NSLog(@"An error occurred while retrieving body mass: %@", error); 
     } 

     [results enumerateStatisticsFromDate:[self startDate] 
             toDate:[NSDate date] 
            withBlock:^(HKStatistics *result, BOOL *stop) { 
             HKQuantity *quantity = result.averageQuantity; 

             const int month = 30 * 24 * 60 * 60; 
             static BOOL isLastMonthResult; 
             static double lastHeight; 

             if ([[NSDate date] timeIntervalSinceDate:result.startDate] < month) { 
              isLastMonthResult = YES; 
              if (!quantity && lastHeight > 0.0) { 
               NSLog(@"Height: %lf", lastHeight); 
              } 
             } 

             if (quantity) { 
              lastHeight = [quantity doubleValueForUnit:[HKUnit meterUnit]] * 100; 
              if (isLastMonthResult) { 
               NSLog(@"Height: %lf", lastHeight); 
              } 
             } 
            }]; 
    }; 

    [self.healthStore executeQuery:query]; 
} 

- (void)getWeight 
{ 
    NSDateComponents *interval = [[NSDateComponents alloc] init]; 
    interval.month = 1; 
    HKQuantityType *quantityType = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierBodyMass]; 

    HKStatisticsCollectionQuery *query = 
    [[HKStatisticsCollectionQuery alloc] initWithQuantityType:quantityType 
             quantitySamplePredicate:nil 
                 options:HKStatisticsOptionDiscreteAverage 
                anchorDate:[NSDate date] 
              intervalComponents:interval]; 

    query.initialResultsHandler = ^(HKStatisticsCollectionQuery *query, HKStatisticsCollection *results, NSError *error) { 
     if (error) { 
      NSLog(@"An error occurred while retrieving body mass: %@", error); 
     } 

     [results enumerateStatisticsFromDate:[self startDate] 
             toDate:[NSDate date] 
            withBlock:^(HKStatistics *result, BOOL *stop) { 
             HKQuantity *quantity = result.averageQuantity; 

             const int month = 30 * 24 * 60 * 60; 
             static BOOL isLastMonthResult; 
             static double lastWeight; 

             if ([[NSDate date] timeIntervalSinceDate:result.startDate] < month) { 
              isLastMonthResult = YES; 
              if (!quantity && lastWeight > 0.0) { 
               NSLog(@"Weight: %lf", lastWeight); 
              } 
             } 

             if (quantity) { 
              lastWeight = [quantity doubleValueForUnit:[HKUnit gramUnit]]/1000; 
              if (isLastMonthResult) { 
               NSLog(@"Weight: %lf", lastWeight); 
              } 
             } 
            }]; 
    }; 

    [self.healthStore executeQuery:query]; 
} 

- (NSDate *)startDate 
{ 
    NSCalendar *calendar = [NSCalendar currentCalendar]; 
    NSDateComponents *components = [calendar components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]]; 
    components.hour = 0; 
    components.year -= 1; 
    NSDate *startDate = [calendar dateFromComponents:components]; 
    return startDate; 
} 
相關問題