从HealthKit监控心率 – >仅在applicationDidBecomeActive(BUG或FEATURE?)之后调用HKAnchoredObjectQuery

我正在写一个简单的应用程序来监视来自HealthKit的心率(HKQuantityTypeIdentifierHeartRate),无论何时将新的运行率值写入HealthKit。

正如在WWDC2015(会话203)中所见,我正在使用HKAnchoredObjectQuery ,它应该用于添加和删除对象。 每当我启动应用程序,我打电话给最新的对象和执行查询HKQuery这工作正常! 但即使样本在那里,我也没有新的样本,但是如果我将应用程序带到背景中,并且再次到达前台,我将获得所有新的心率。 它是一个错误吗? 或者我应该怎么做才能监控心率,而不必将应用程序推到后台和前台呢?

这里是我使用的代码(一切都存储在AppDelegate中),我正在调用[self requestAccessDataTypes]; 来自didFinishLaunchingWithOptions

 [healthStore enableBackgroundDeliveryForType:sampleType frequency:HKUpdateFrequencyImmediate withCompletion:^(BOOL success, NSError *error) {}]; HKQuery *query = [self createHeartRateStreamingQuery:datum]; if (query) { [healthStore executeQuery:query]; } else { NSLog(@"workout can not start"); } 

 -(HKQuery*)createHeartRateStreamingQuery:(NSDate*)workoutStartDate { NSLog(@"%@ - createHeartRateStreamingQuery", [self class]); if ([HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate]) { HKQuantityType *quantityType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate]; HKAnchoredObjectQuery * heartRateQuery = [[HKAnchoredObjectQuery alloc] initWithType:quantityType predicate:nil anchor:anchor limit:HKObjectQueryNoLimit resultsHandler:^(HKAnchoredObjectQuery * _Nonnull query, NSArray<__kindof HKSample *> * _Nullable sampleObjects, NSArray<HKDeletedObject *> * _Nullable deletedObjects, HKQueryAnchor * _Nullable newAnchor, NSError * _Nullable error) { if (!error) { anchor = newAnchor; [self updateHeartRate:sampleObjects]; } }]; heartRateQuery.updateHandler = ^void(HKAnchoredObjectQuery *query, NSArray<__kindof HKSample *> * __nullable addedObjects, NSArray<HKDeletedObject *> * __nullable deletedObjects, HKQueryAnchor * __nullable newAnchor, NSError * __nullable error) { if (!error) { anchor = newAnchor; [self updateHeartRate:addedObjects]; } }; return heartRateQuery; } return nil; } 

现在(iOS 9.1,WatchOS 2.0.1),无法通过iOS应用程序从HealthKit获取最新数据。 WWDC演示是可能的,因为代码运行在WatchOS应用的ExtensionDelegate而不是iOS应用上。 这里提交了一个rdar错误报告。

要获取iOS上的最新数据,无法创buildWatchOS应用程序是不可能的。 使用WatchOS应用程序,您可以使用锻炼会话和观看连接function在每次更改时将心率数据发送到iOS应用程序。

当然,如果您的心率数据不是来自苹果手表,这也无济于事。 希望它会在即将发布的版本中得到修复。

您错过了观察HealthKit更改的关键部分。 这就是所谓的HKObserverQuery

文件

观察者查询在后台队列上设置长时间运行的任务。 此任务监视HealthKit存储,并在每次将匹配数据保存到商店或从商店中删除时提醒您。 观察者查询可让您的应用程序响应其他应用程序和设备所做的更改。

回顾

您必须将HKAnchoredObjectQuery封装在HKAnchoredObjectQuery中, HKObserverQuery启用了后台交付function才能获得有关更新的通知。 每当发生这种情况时,您就可以执行查询。

注1: HKObserverQuery的更新处理程序不会给你任何Apple Health数据样本。 您仍然必须执行您的HKAnchoredObjectQuery与一个适当的锚点来获取样本。

注2:每次启动应用程序时,必须设置HKObserverQuery

欲了解更多信息,请看我的答案。