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

标签 ios objective-c healthkit

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

最佳答案

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

关于ios - 如何将我们在健康应用程序中输入的高度和体重数据读取到我们的自定义应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29389540/

相关文章:

iphone - 过滤不是来 self 的应用程序的 HKSample 数据

ios - 重新分配指针会导致内存泄漏吗?

ios - 如何在 IOS 中实现纯搜索栏

ios - 如何在单击添加按钮时动态添加新的文本字段

ios - iPhone物理尺寸确定,包括 future 的设备......?

swift - 尝试启动 HKLiveWorkout 时总是意外地发现 session 为零

ios8 - 从另一个应用程序打开 HealthKit 应用程序

iOS 8 boundingRectWithSize 计算错误的文本大小

iOS 12 在 QuickType 栏中建议电话号码

objective-c - 如何解释 objective-c 类型说明符(例如,由 method_copyReturnType() 返回)?