我尝试做一个非常基本的事情:设置一个HKObserverQuery,这样我就可以知道各种数据点何时被更改(我确保用户已授权应用程序使用数据点问题。)无论出于何种原因,我可以在每次启动应用程序时触发查询,但是当我关闭应用程序,进入运行状况应用程序并手动更新数据点时,它不会触发。我已经进行了大量的搜索,并且无法成功使用其他人发布的代码,他们说这些代码适用于他们。
我在Cocoa / Objective C开发两周后,所以我确定我错过了一些明显的东西,但我无法看到它是什么。这里的任何指导都很棒,即使它只是调试的建议。由于应用程序本身已关闭,并且我没有收到可能在控制台中注销的任何内容,因此我无法真正了解正在发生的事情。
我用于观察者查询的代码如下:
HKQuantityType *heartRate = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate];
[self.healthStore enableBackgroundDeliveryForType:heartRate frequency:HKUpdateFrequencyImmediate withCompletion:^(BOOL success, NSError *error) {
if (success) {
NSLog(@"observing heart rate");
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.bodbot.com/Scripts/wearable_heartrate_changed.php"]];
}else{
NSLog(@"FAILED observing heart rate");
}
}];
HKObserverQuery *query = [[HKObserverQuery alloc] initWithSampleType:heartRate predicate:nil updateHandler:^(HKObserverQuery *query, HKObserverQueryCompletionHandler completionHandler, NSError *error) {
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.bodbot.com/Scripts/wearable_heartrate_changed.php"]];
}];
[self.healthStore executeQuery:query];
谢谢!
答案 0 :(得分:3)
我发现,根据经验(不是来自文档),Observer Query在模拟器中运行时不会触发,但在设备上运行时会触发。我没有开启后台模式功能。
答案 1 :(得分:0)
当您在iOS上暂停某个应用时,默认情况下它会停止运行,除非它已经background task assertion或background mode entitlement。应用程序在未运行时无法接收通知。 HealthKit有一个功能,可以在有特定类型的新样本时在后台唤醒您的应用程序。请参阅HKHealthStore的Managing Background Delivery文档。只要有新数据,即使您的应用尚未运行,也可以将其与HKObserverQuery结合使用。