【问题标题】: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];
        }

【问题讨论】:

    标签: ios background-process healthkit


    【解决方案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 。听起来不像。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-16
    • 1970-01-01
    相关资源
    最近更新 更多