当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 :方法被调用时,您可以假设应用程序启动。 这就是为什么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]; 

您可以在此处找到更多详细信息

接收背景交付

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

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

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