标签: hkobserverquery

正确使用HKObserverQuery的后台更新completionHandler

HKObserverQuery 有以下方法支持在后台接收更新:

- initWithSampleType:predicate:updateHandler:
Run Code Online (Sandbox Code Playgroud)

updateHandler有一个completionHandler具有以下文件:

该块传递给更新处理程序.完成处理传入数据后,必须立即调用此块.调用此块告诉HealthKit您已成功接收到后台数据.如果您不调用此块,HealthKit将继续尝试使用退避算法启动您的应用.如果您的应用无法响应三次,HealthKit会假定您的应用无法接收数据,并停止向您发送后台更新.

通过查看其他帖子,似乎围绕此处理程序存在很多混乱.以下是我对它的一些问题:

  • 应该何时调用处理程序?如果调用太晚,那么HK可能会认为应用程序从未收到过查询更新,导致您点击后台更新3-strikes back-off算法.文档声明应在处理其他查询后调用它.根据运行这些查询所需的时间,听起来你可能会危险地接近达到后台更新攻击.
  • 为什么需要这个?系统不应该知道应用程序已经启动并且已经收到后台更新吗?CoreBluetooth在后台使用时,它只会在后台唤醒您的应用程序10秒钟.无需调用任何处理程序或处理后台更新3次攻击.
  • 如果您点击后台更新3次罢工而HK停止发送更新是永久性的吗?香港是否曾开始再次发送背景更新?如果有一个错误阻止处理程序被调用,现在你已经修复了它.该应用程序是否卡住从未收到更新?或者,当应用重新启动或更新时,它会重置吗?
  • 在调用处理程序之前,HK是否会让您的应用程序在后台运行?这是其目的的一部分还是仅仅是副作用?如果这是它的目的的一部分,我们可以在需要停止之前运行多长时间(并点击第一次背景更新警示)?

background ios healthkit hkobserverquery

68
推荐指数
1
解决办法
1182
查看次数

HKObserverQuery 连续随机调用两次

我有一个正在尝试解决的问题,我已经设置了一个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

5
推荐指数
1
解决办法
1542
查看次数