Ios 从HealthKit监测心率-->;HKANCOREDOBJECTQUERY仅在ApplicationIDBECOMEACTIVE(错误或功能?)之后调用
我正在编写一个简单的应用程序来监测心率(HKQuantityTypeIdentifierHearRate),每当一个新的健康率值写入HealthKit时,都可以从HealthKit中监测心率(HKQuantityTypeIdentifierHearRate) 正如在WWDC2015(第203次会议)上所看到的,我正在使用一个HKAnchoredObjectQuery来添加和删除对象。每当我启动应用程序时,我都会调用HKQuery查找最新的对象,并执行查询,效果很好!!!但即使有样本,我也不会得到新的样本,但如果我把应用程序带到后台,再带到前台,我会得到所有新的心率。是虫子吗?或者,在不将应用程序带到后台和前台的情况下,我该如何监控心率 下面是我正在使用的代码(所有内容都存储在AppDelegate中),我正在调用Ios 从HealthKit监测心率-->;HKANCOREDOBJECTQUERY仅在ApplicationIDBECOMEACTIVE(错误或功能?)之后调用,ios,ios9,healthkit,hkhealthstore,Ios,Ios9,Healthkit,Hkhealthstore,我正在编写一个简单的应用程序来监测心率(HKQuantityTypeIdentifierHearRate),每当一个新的健康率值写入HealthKit时,都可以从HealthKit中监测心率(HKQuantityTypeIdentifierHearRate) 正如在WWDC2015(第203次会议)上所看到的,我正在使用一个HKAnchoredObjectQuery来添加和删除对象。每当我启动应用程序时,我都会调用HKQuery查找最新的对象,并执行查询,效果很好!!!但即使有样本,我也不会得到
[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时获得数据,而不需要这样的解决办法。