HKObserverQuery
有以下方法支持在后台接收更新:
- initWithSampleType:predicate:updateHandler:
Run Code Online (Sandbox Code Playgroud)
该updateHandler
有一个completionHandler
具有以下文件:
该块传递给更新处理程序.完成处理传入数据后,必须立即调用此块.调用此块告诉HealthKit您已成功接收到后台数据.如果您不调用此块,HealthKit将继续尝试使用退避算法启动您的应用.如果您的应用无法响应三次,HealthKit会假定您的应用无法接收数据,并停止向您发送后台更新.
通过查看其他帖子,似乎围绕此处理程序存在很多混乱.以下是我对它的一些问题:
CoreBluetooth
在后台使用时,它只会在后台唤醒您的应用程序10秒钟.无需调用任何处理程序或处理后台更新3次攻击.我有一个正在尝试解决的问题,我已经设置了一个HKObserveryQuery
,它运行良好并为我收集新数据。
然而问题是,有时当我返回“健康”应用程序并在手动将其添加到“健康”应用程序后删除一个项目时,我注意到我HKObserverQuery
已经非常紧密地一起设置了两次火灾,我正在尝试这样做解决,因为我使用这个观察者稍后上传一些数据,并且我不想要重复的。
我将不胜感激提供的任何帮助。代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[self setup];
return YES;
}
- (void)setup
{
if ([HKHealthStore isHealthDataAvailable])
{
self.healthStore = [[HKHealthStore alloc]init];
NSSet *readTypes = [NSSet setWithObject:[HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate]];
[self.healthStore requestAuthorizationToShareTypes:nil
readTypes:readTypes
completion:^(BOOL success, NSError *error)
{
if (!error && success)
{
[self observeHR];
[self.healthStore enableBackgroundDeliveryForType:
[HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate]
frequency:HKUpdateFrequencyImmediate withCompletion:^(BOOL success, NSError *error){}];
}
}];
}
}
- (void)observeHR
{
HKObserverQuery *query = [[HKObserverQuery alloc]initWithSampleType:[HKSampleType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate]
predicate:nil
updateHandler:^(HKObserverQuery *query, HKObserverQueryCompletionHandler completionHandler, NSError *error)
{ …
Run Code Online (Sandbox Code Playgroud) objective-c uiapplicationdelegate ios healthkit hkobserverquery