Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/97.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从HealthKit监测心率-->;HKANCOREDOBJECTQUERY仅在ApplicationIDBECOMEACTIVE(错误或功能?)之后调用_Ios_Ios9_Healthkit_Hkhealthstore - Fatal编程技术网

Ios 从HealthKit监测心率-->;HKANCOREDOBJECTQUERY仅在ApplicationIDBECOMEACTIVE(错误或功能?)之后调用

Ios 从HealthKit监测心率-->;HKANCOREDOBJECTQUERY仅在ApplicationIDBECOMEACTIVE(错误或功能?)之后调用,ios,ios9,healthkit,hkhealthstore,Ios,Ios9,Healthkit,Hkhealthstore,我正在编写一个简单的应用程序来监测心率(HKQuantityTypeIdentifierHearRate),每当一个新的健康率值写入HealthKit时,都可以从HealthKit中监测心率(HKQuantityTypeIdentifierHearRate) 正如在WWDC2015(第203次会议)上所看到的,我正在使用一个HKAnchoredObjectQuery来添加和删除对象。每当我启动应用程序时,我都会调用HKQuery查找最新的对象,并执行查询,效果很好!!!但即使有样本,我也不会得到

我正在编写一个简单的应用程序来监测心率(HKQuantityTypeIdentifierHearRate),每当一个新的健康率值写入HealthKit时,都可以从HealthKit中监测心率(HKQuantityTypeIdentifierHearRate)

正如在WWDC2015(第203次会议)上所看到的,我正在使用一个HKAnchoredObjectQuery来添加和删除对象。每当我启动应用程序时,我都会调用HKQuery查找最新的对象,并执行查询,效果很好!!!但即使有样本,我也不会得到新的样本,但如果我把应用程序带到后台,再带到前台,我会得到所有新的心率。是虫子吗?或者,在不将应用程序带到后台和前台的情况下,我该如何监控心率

下面是我正在使用的代码(所有内容都存储在AppDelegate中),我正在调用
[self-requestAccessDataTypes]使用选项完成启动:

[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*)CreateCheartRateStreamingQuery:(NSDate*)工作开始日期
{
NSLog(@“%@-createHeartRateStreamingQuery”,[self class]);
if([HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartate]){
HKQuantityType*quantityType=[HKQuantityType quantityTypeForIdentifier:hkQuantityTypeIdentifierHeartate];
HKAnchoredObjectQuery*heartRateQuery=[[HKAnchoredObjectQuery alloc]initWithType:quantityType谓词:零锚定:锚定限制:HKObjectQueryNoLimit结果处理程序:^(HKAnchoredObjectQuery*\非空查询,NSArray*\可空采样对象,NSArray*\可空删除对象,HKQueryAnchor*\可空新锚定,NSError*\可空错误){
如果(!错误){
锚=新锚;
[self-UpdateHeartate:sampleObjects];
}
}];
heartRateQuery.updateHandler=^void(HKANCOREDOBJECTQUERY*查询,NSArray*\uu可为空的加法对象,NSArray*\uu可为空的删除对象,HKQueryAnchor*\uu可为空的新锚,NSError*\uu可为空的错误)
{
如果(!错误){
锚=新锚;
[self-updateHeartRate:addedObjects];
}
};
返回heartRateQuery;
}
返回零;
}
目前(iOS 9.1、WatchOS 2.0.1),无法通过iOS应用程序从HealthKit获取最新数据。这在WWDC演示中是可能的,因为代码是在WatchOS应用程序的ExtensionLegate上运行的,而不是在iOS应用程序上运行的。有一个rdar错误报告存档

要在iOS上获取最新数据,不创建WatchOS应用程序是不可能的。使用WatchOS应用程序,您可以使用和在每次更改时向iOS应用程序发送心率数据


当然,如果你的心率数据不是来自苹果手表,这也没用。希望它能在即将发布的版本中得到修复。

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

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

重述

[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");
    }
您必须在
HKObserverQuery
中包装您的
HKAnchoredObjectQuery
,并启用后台传递,以便获得更新通知。然后,您可以在任何时候执行查询

注1:
HKObserverQuery
的更新处理程序不会向您提供任何苹果健康数据样本。您仍然需要使用适当的锚执行
HKAnchoredObjectQuery
,以获取样本

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


有关更多信息,请查看我的答案。

谢谢您的回答,但我使用的是将HealthKit数据从手表自动传输到父应用程序,正如我在请求中所写,数据或多或少是实时传输的!每当我启动应用程序时,我都会调用HKQuery以获取最新的对象,并在父应用程序(例如iPhone)上执行Query,这很好!!!但即使有样本,我也不会得到新的样本,但如果我将应用程序带到后台,再带到前台,我会得到所有新的心率。必须关闭应用程序才能获得最新数据,这肯定不理想吗?我试图暗示这个问题,希望苹果能够在它进入iOS上的HealthKit时获得数据,而不需要这样的解决办法。