我使用下面的代码让我的应用程序在后台检测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];
}
答案 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知道您已成功收到后台投放。