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 活动
HKMetadataKeyTimeZone 对于由苹果的 Health App - HealthKit - iOS 创建的健康数据始终为零
HKMetadataKeyTimeZone 对于由苹果的 Health App - HealthKit - iOS 创建的健康数据始终为零