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



我使用下面的代码让我的应用程序在后台检测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];
        }

有点晚了,但希望它仍然能帮助您或其他到达这里的人。。

当您的应用程序代理的application:didFinishLaunchingWithOptions:方法被调用时,您可以假设应用程序启动。这就是为什么苹果建议你在该方法中注册你想要的任何观察者查询。

当出现您注册的类型的新数据时,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];

您可以在这里找到更多详细信息:

接收后台交付

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

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

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

相关内容

最新更新