HealthKit:获取由身体活动、背景和终止状态触发的通知(Obj-C,iOS 10.3)

Posted

技术标签:

【中文标题】HealthKit:获取由身体活动、背景和终止状态触发的通知(Obj-C,iOS 10.3)【英文标题】:HealthKit: getting a notification triggered by physical activity, background and terminated state (Obj-C, iOS 10.3) 【发布时间】:2017-04-13 20:39:27 【问题描述】:

假设我们使用步数作为触发器 - 如果用户走了 10 步,我希望弹出一个通知来说明这一点。

这里已经回答了这个问题: Healthkit background delivery when app is not running

但是,我无法让它工作。如果我在前台使用该应用程序,步数将得到更新。如果我将应用程序留在后台,则步数似乎只有在我重新打开应用程序后才会更新。所以后台查询似乎不起作用。

我试过启用后台模式,没有效果;我已经尝试将应用程序留在后台几个小时,认为可能需要一段时间才能发送数据 - 什么都没有。

其他地方有人说要尝试 StatisticsCollectionQuery,因为 StatisticsQuery 被破坏了 - 这是真的吗? StatisticsCollectionQuery 对于我正在做的事情并不理想。

这是我的查询代码:

[self.healthStore enableBackgroundDeliveryForType:[HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount]
                                        frequency:HKUpdateFrequencyImmediate
                                   withCompletion:^(BOOL success, NSError * _Nullable error) 
                                       if (error) 

                                           // Perform Proper Error Handling Here...
                                           NSLog(@"*** An error occured while setting up background updates. %@ ***",
                                                 error.localizedDescription);
                                       
                                       if (success == YES) 
                                           backgroundEnabled = YES;
                                       
                                   ];


// set up running observer

HKSampleType *sampleType =
[HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount];

HKObserverQuery *query =
[[HKObserverQuery alloc]
 initWithSampleType:sampleType
 predicate:nil
 updateHandler:^(HKObserverQuery *query,
                 HKObserverQueryCompletionHandler completionHandler,
                 NSError *error) 

     if (error) 

         // Perform Proper Error Handling Here...
         NSLog(@"*** An error occured while setting up the stepCount observer. %@ ***",
               error.localizedDescription);
         // Error popup

         return;
     

     // Take whatever steps are necessary to update your app's data and UI
     // This may involve executing other queries
     [self updateDailyStepCount];

     // If you have subscribed for background updates you must call the completion handler here.
     completionHandler();

 ];

[self.healthStore executeQuery:query];

【问题讨论】:

【参考方案1】:

您请求HKUpdateFrequencyImmediate 的事实表明您可能没有仔细研究过enableBackgroundDeliveryForType:frequency:withCompletion: 的文档。文档有一个大的“注释”框,说明步数永远不会比每小时更频繁地提供。

如果是这样,我建议仔细阅读该部分的讨论,因为 HK 是棘手且不明显的。例如,您是否在application:didFinishLaunchingWithOptions: 中调用此查询?您是否尝试过重新安装您的应用程序(我会从头开始删除并重新安装)。如果您不拨打completionHandler() 3 次,ios 将停止通知您。我建议构建一个小而简单的应用程序,它只记录步数;用它来处理所有细节。

另见HealthKit (iOS) wont deliver data in background (objC)。目前尚不清楚您是否已经在讨论中实施了这些要点。

【讨论】:

我使用 HKUpdateFrequencyImmediate 只是为了获得最快的结果,但我知道它会默认为每小时,我可以尝试更改它。我在应用程序中调用查询:didFinishLaunchingWithOptions。我阅读了讨论,它说你必须调用 completionHandler 一次,我做到了(三次是别的)。 对不起,就是3次的意思,如果iOS问你3次你没有回应,那么它就不再问你了。但你似乎已经在这上面了。

以上是关于HealthKit:获取由身体活动、背景和终止状态触发的通知(Obj-C,iOS 10.3)的主要内容,如果未能解决你的问题,请参考以下文章

仅从 healthkit 获取 AutoDetected 活动

仅从 healthkit 获取 AutoDetected 活动

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

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

HKMetadataKeyTimeZone 对于由苹果的 Health App - HealthKit - iOS 创建的健康数据始终为零

HKMetadataKeyTimeZone 对于由苹果的 Health App - HealthKit - iOS 创建的健康数据始终为零