使用Apple的Healthkit的心率

时间:2015-07-15 20:17:23

标签: ios health-kit hkhealthstore

我目前在应用中使用Healthkit并且在获取大多数类型的信息方面没有任何问题,但我的心率有问题。每当我尝试阅读样本时,我都会得到" 0"结果是。我有一个Apple Watch,我的Heart Rate被输入到Apple Health应用程序中,可以直观地看到它,所以它不是硬件问题。我只需要显示它,不需要再写回数据。它在第一次运行时请求我允许访问心率,所以不应该是该代码的任何问题,但我还是会发布它。

我可以通过心率检测找到的大多数例子都在Swift中,我更喜欢远离它,或者过时的蓝牙/相机方法。

以下是我正在使用的内容,主要是从代码中复制和粘贴代码,该代码可以检索我的代码中的其他位置的步骤,步行距离等...所以我可能在这个块中得到了一些内容与心率数据类型不兼容,但我无法找到它。现在看起来它将获得当天的平均心率,而不是最新的样本,这是现在好的,只要我能看到某些类型的数据被输入到应用程序。我无法找到一种方法来查询心率的最新样本,这让我相信我完全使用了错误的方法,但无法找到任何其他信息或样本。我尝试过8种不同的在线示例代码/项目,除了" 0"结果(所以请不要链接到示例代码......我已经尝试了所有可用的...谷歌,github等等,所以任何链接都可能会得到一个"我&#39已经测试了一个相同的错误"响应,lol)。这就是我现在正在使用的内容:

我99.9%肯定会遇到问题:

    - (void)queryHealthDataHeart{
    HKQuantityType *typeHeart =[HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate];
    NSDate *now = [NSDate date];
    NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar];
    NSDateComponents *components = [calendar components:NSCalendarUnitYear| NSCalendarUnitMonth | NSCalendarUnitDay
                                               fromDate:now];
    NSDate *beginOfDay = [calendar dateFromComponents:components];
    NSPredicate *predicate = [HKQuery predicateForSamplesWithStartDate:beginOfDay endDate:now options:HKQueryOptionStrictStartDate];

    HKStatisticsQuery *squery = [[HKStatisticsQuery alloc] initWithQuantityType:typeHeart quantitySamplePredicate:predicate options:HKStatisticsOptionNone completionHandler:^(HKStatisticsQuery *query, HKStatistics *result, NSError *error) {
        dispatch_async(dispatch_get_main_queue(), ^{
            HKQuantity *quantity = result.averageQuantity;
            double beats = [quantity doubleValueForUnit:[HKUnit heartBeatsPerMinuteUnit]];
            _lblHeart.text = [NSString stringWithFormat:@"%.f",beats];
        }
        );
    }];
    [self.healthStore executeQuery:squery];
}

检查权限的代码:

- (void)readHealthKitData{
HKHealthStore *healthStore = [[HKHealthStore alloc] init];
NSSet *shareObjectTypes = [NSSet setWithObjects:
                           nil];
NSSet *readObjectTypes  = [NSSet setWithObjects:
                           [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierDistanceWalkingRunning],
                           [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate],
                           [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierFlightsClimbed],
                           [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount],
                           nil];
// Request access
[healthStore requestAuthorizationToShareTypes:shareObjectTypes
                                    readTypes:readObjectTypes
                                   completion:^(BOOL success, NSError *error) {
                                       if(success == YES)
                                       {
                                           [self queryHealthData];
                                           [self queryHealthDataDistance];
                                           [self queryHealthDataFlights];
                                           [self queryHealthDataHeart];
                                       }
                                       else
                                       {
                                           // Determine if it was an error or if the
                                           // user just canceld the authorization request
                                       }

                                   }];}

在我的 - (void)queryHealthDataHeart之上,我有正确的引用,如下所示:

#import "AN_Pedometer.h"
#import <HealthKit/HealthKit.h>

@interface AN_Pedometer (){
UILabel *lbCMData;
NSDateFormatter *formatter;}
@property (nonatomic, strong) CMPedometer *pedometer;
@property (nonatomic, strong) HKHealthStore *healthStore;
@end
@interface HKUnit (HKManager)
+ (HKUnit *)heartBeatsPerMinuteUnit;
@end

@implementation HKUnit (HKManager)

+ (HKUnit *)heartBeatsPerMinuteUnit {
return [[HKUnit countUnit] unitDividedByUnit:[HKUnit minuteUnit]];
}

@end

2 个答案:

答案 0 :(得分:1)

从我读到的内容来看,如果我是正确的,那么从一开始到现在,你都在努力读取心率。

使用日期格式化程序后,请通过注销来检查开始日期和结束日期。可能是开始时间和结束时间相同,这就是为什么你得到0作为结果。

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZ"];
NSString *dateString = [dateFormatter stringFromDate:beginOfDay];
NSLog(@"%@", dateString);

您还应将小时分和秒设置为零,以确保您获得当天开始的时间。

NSDateComponents *components = [calendar components:NSCalendarUnitYear| NSCalendarUnitMonth | NSCalendarUnitDay
                                           fromDate:now];
components.hour = 0;
components.minute = 0;
components.second = 0;

希望这有帮助。

答案 1 :(得分:1)

如果你想在你的HKStatisticsQuery选项中获得averageQuantity请求它。否则它将始终为零(即未计算): options参数应设置为HKStatisticsOptionDiscreteAverage,NOT HKStatisticsOptionNone