心率与苹果的Healthkit

我目前在一个应用程序使用Healthkit,并没有问题获得大多数types的信息,但是心率有问题。 每次我尝试阅读一个样本时,结果都是“0”。 我有一个苹果手表,我的心率得到喂养苹果健康的应用程序,并可以在那里直观地看到它,所以这不是一个硬件问题。 我只需要显示它,不需要写回数据。 它允许我第一次运行允许访问心率,所以不应该有任何与该代码的问题,但我会发布它。

我可以find心率检测的大多数例子是在Swift中,我宁愿远离,或过时的蓝牙/相机方法。

这里是我正在使用的,它主要是从我的代码中的其他地方检索步骤,步行距离等代码复制和粘贴…所以我可能有一些在这个块不符合心率数据types,但我找不到它。 现在看起来,它会获得一天的平均心率,而不是最新的样本,这是现在罚款,只要我能看到一些types的数据被馈送到应用程序。 我无法find一个方法来轮询最新的心率样本,这导致我相信我完全使用了错误的方法,但找不到任何其他信息或样本。 我已经尝试了大约8种不同的在线示例代码/项目,其中没有一个能够产生“0”以外的任何结果(所以请不要链接到示例代码…我已经尝试了所有可用的代码…谷歌,GitHub,等等,所以任何链接可能会得到一个“我已经testing,同一个错误”的回应,哈哈)。 这是我现在使用的:

我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 

从我阅读的内容来看,如果我是正确的,那么你就是从一开始就读到心率。

使用date格式化程序后,将其注销,以检查开始date和结束date。 可能是开始时间和结束时间是相同的,这就是为什么你得到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; 

希望这可以帮助。

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