OStack程序员社区-中国程序员成长平台

标题: ios - 如何将我们在健康应用程序中输入的高度和体重数据读取到我们的自定义应用程序中 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-12 14:55
标题: ios - 如何将我们在健康应用程序中输入的高度和体重数据读取到我们的自定义应用程序中

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



Best Answer-推荐答案


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/






欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) Powered by Discuz! X3.4