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

Ing*_*Ron 5 ios healthkit hkhealthstore ios9

每当将新的健康速率值写入HealthKit时,我正在编写一个简单的应用程序来监控HealthKit的心率(HKQuantityTypeIdentifierHeartRate).

正如在WWDC2015(会话203)中看到的,我正在使用HKAnchoredObjectQuery,它应该用于添加和删除对象.每当我启动应用程序时,我都会调用HKQuery来获取最新的对象并执行可以正常运行的查询!但即使样品在那里,我也没有得到新的样品,但是如果我将应用程序带到后台并再次到达前台,我将获得所有新的心率.这是一个BUG吗?或者我该如何监控心率而不将应用程序带到后台和前台?

这是我正在使用的代码(一切都存储在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");
    }
Run Code Online (Sandbox Code Playgroud)
-(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;
}
Run Code Online (Sandbox Code Playgroud)

dam*_*hec 1

您缺少观察 HealthKit 变化的关键部分。它被称为HKObserverQuery.

文档

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

回顾

您必须启用HKAnchoredObjectQuery后台HKObserverQuery传送才能收到有关更新的通知。然后,只要发生这种情况,您就可以执行查询。

注意 1:HKObserverQuery的更新处理程序不会为您提供任何 Apple Health 数据样本。您仍然需要HKAnchoredObjectQuery使用适当的锚点来执行您的操作才能获取样本。

HKObserverQuery注意 2:您必须在每次启动应用程序时进行设置。

欲了解更多信息,请查看我的回答