首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将我们在健康应用程序中输入的身高和体重数据读取到自定义应用程序中

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

Stack Overflow用户
提问于 2015-04-01 19:27:17
回答 2查看 1.6K关注 0票数 2

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

EN

回答 2

Stack Overflow用户

发布于 2016-08-19 21:35:19

1.请求HealthKit授权:

代码语言:javascript
复制
- (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.获取身高和体重:

代码语言:javascript
复制
- (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;
}
票数 3
EN

Stack Overflow用户

发布于 2015-04-13 14:22:37

您可以启用关于要在后台读取的数据类型的后台通知。例如,下面是实现体重数据的后台传递的方法。您可以在didFinishLaunchingWithOptions方法中调用此方法。

代码语言:javascript
复制
-(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];
}

在成功通知时,您可以编写自己的自定义方法并调用它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29389540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档