如何阅读我们在健康应用程序中输入的自定义应用程序的身高和体重数据

时间:2015-04-01 11:27:17

标签: ios objective-c health-kit

如何阅读我们在自定义应用中的健康应用中输入的身高和体重数据值?

2 个答案:

答案 0 :(得分:2)

<强> 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;
}

答案 1 :(得分:0)

您可以对要在后台阅读的数据类型启用后台通知。 例如,下面是能够在重量数据上进行背景传递的方法。您可以在didFinishLaunchingWithOptions方法中调用此方法。

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

成功通知后,您可以编写自己的自定义方法并进行调用。