当 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 不工作

从后台唤醒应用程序 iOS

应用程序终止时的 Healthkit 后台交付

应用程序终止时的 Healthkit 后台交付

应用程序在后台时如何查询 HealthKit (HKWorkout) 更新?

如何在后台刷新的并发症上显示 HealthKit 数据?