当 Healthkit 在后台唤醒我的应用程序时,AppDelegate 是不是会初始化?
Posted
技术标签:
【中文标题】当 Healthkit 在后台唤醒我的应用程序时,AppDelegate 是不是会初始化?【英文标题】:Does the AppDelegate initialize when Healthkit wakes my app in the background?当 Healthkit 在后台唤醒我的应用程序时,AppDelegate 是否会初始化? 【发布时间】:2015-06-29 13:58:35 【问题描述】:我使用下面的代码让我的应用在后台检测 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】:有点晚了,但希望它仍然可以帮助您或其他任何到达这里的人..
当您的应用委托的 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 就会为任何与新保存的数据匹配的观察者查询调用更新处理程序。如果您计划支持后台交付,请在您的应用委托的
application:didFinishLaunchingWithOptions
: 方法中设置所有观察者查询。通过在application:didFinishLaunchingWithOptions
: 中设置查询,您可以确保在 HealthKit 交付更新之前查询已实例化并可以使用。在您的观察者查询处理完新数据后,您必须调用更新的完成处理程序。这让 HealthKit 知道您已成功收到后台交付。
【讨论】:
这意味着对 enableBackgroundDeliveryForType 的调用只需要进行一次,对吗? (我在 HealthKit 身份验证时这样做)想知道我是否还需要在 AppDelegate didFinishLaunchingWithOptions 中调用 enableBackgroundDeliveryForType 。听起来不像。以上是关于当 Healthkit 在后台唤醒我的应用程序时,AppDelegate 是不是会初始化?的主要内容,如果未能解决你的问题,请参考以下文章
当应用程序处于后台模式时,HealthKit Observer 不工作