当Healthkit在后台唤醒我的应用程序时,AppDelegate是否会初始化?

时间:2015-06-29 13:58:36

标签: ios background-process health-kit

我使用下面的代码让我的应用程序在后台检测HealthKit数据的更新。当此代码在后台运行时,是否会调用AppDelegate的init方法?将调用AppDelegate中的哪些方法?如果有人可以提供有关后台代码的应用程序生命周期的文档,那将非常感激!

[healthStore enableBackgroundDeliveryForType:type frequency:HKUpdateFrequencyHourly withCompletion:^(BOOL success, NSError *error) {
        if (success) {
            HKObserverQuery *observerQuery = [[HKObserverQuery alloc] initWithSampleType:type
                                                                               predicate:nil
                                                                           updateHandler:^(HKObserverQuery *query, HKObserverQueryCompletionHandler completionHandler, NSError *error) {
                                                                               if (!error) {
                                                                                   [self retrieveHealthDataWithCompletionHandler:completionHandler];
                                                                               }
                                                                           }];
            [healthStore executeQuery:observerQuery];
        }

1 个答案:

答案 0 :(得分:1)

有点晚了,但希望它能帮到你或到达这里的任何人......

当你的app委托的application:didFinishLaunchingWithOptions:方法被调用时,你可以认为该应用程序已启动。这就是为什么Apple建议您注册任何观察者的查询,并希望您拥有该方法。

当您注册的类型有新数据时,HealthKit会唤醒您的应用。 (到目前为止,您仍然不了解任何新数据。)一旦您的应用完成启动,它将调用心爱的应用代理的application:didFinishLaunchingWithOptions:方法,如前所述,应该包含注册代码观察者查询。

一旦你注册了你的查询,下一件事就是获得有关新数据的更新(这是观察者查询的目的)。

获取有关HealthKit中新功能的更新并不包含数据本身。这就是为什么在观察者查询的updateHandler中你应该启动另一个查询 - 一个更具体的查询来获取想要的数据。

那就是它。我会对您提供的代码进行一些更改以使其正常工作:

[healthStore enableBackgroundDeliveryForType:type frequency:HKUpdateFrequencyHourly withCompletion:^(BOOL success, NSError *error) {
    if (success) {
      //Nothing much to do here
    }
}];

HKObserverQuery *observerQuery = [[HKObserverQuery alloc] initWithSampleType:type
                                                                           predicate:nil
                                                                       updateHandler:^(HKObserverQuery *query, HKObserverQueryCompletionHandler completionHandler, NSError *error) {
    if (!error) {
       //Create and execute a query about the sample type.
       // Within the completion handler of the new query, don't forget to call completionHandler()

    }
}];
[healthStore executeQuery:observerQuery];

您可以找到更多详情here

  

接收后台交付

     

通过调用HealthKit商店的enableBackgroundDeliveryForType:frequency:withCompletion:方法,应用程序还可以在后台注册接收更新。此方法为您的应用注册后台通知。每当指定类型的新样本保存到商店时,HealthKit都会唤醒您的应用程序。根据您在注册时指定的频率定义的每个时间段,您的应用最多被调用一次。

     

只要您的应用程序启动,HealthKit就会为与新保存的数据匹配的任何观察者查询调用更新处理程序。如果您计划支持后台投放,请在您的app delegate的application:didFinishLaunchingWithOptions:方法中设置所有观察者查询。通过在application:didFinishLaunchingWithOptions:中设置查询,您可以确保在HealthKit提供更新之前实例化并准备好使用查询。

     

在观察者查询处理完新数据后,您必须调用更新的完成处理程序。这让HealthKit知道您已成功收到后台投放。