【问题标题】:Checking healthkit data periodically in background swift在后台快速定期检查 healthkit 数据
【发布时间】:2016-04-09 19:23:32
【问题描述】:

我正在为我的支持 HealthKit 的 iOS 应用程序编写一个不活动警报。当用户在过去 60 分钟内走的步数少于 100 步时,根据 Health 中的数据,它会发送通知。当应用程序打开时,这可以完美运行,但我在使其在后台运行时遇到了一些麻烦。我已经尝试在本教程 (https://www.raywenderlich.com/92428/background-modes-ios-swift-tutorial) 中描述的后台位置检查程序中获取步骤数据,但由于某些原因,当本教程的程序在真正的 iPhone 上运行时,位置数据会停止在后台收集。

所以,我的问题是:我的应用如何在后台每分钟可靠地检查健康数据,即使应用已关闭数天?

【问题讨论】:

  • 请包含与 HealthKit 交互的相关代码的 sn-ps,以便我们看到您到目前为止所做的尝试。
  • 我基本上已经解决了这个问题,通过在后台跟踪用户的位置。如果其他人在这里寻找答案,请知道您应该使用该教程,但也可以将代码的 sn-p 添加到您在此处找到的项目中:stackoverflow.com/a/32939887/5700898

标签: ios iphone swift swift2 healthkit


【解决方案1】:

当设备被锁定时,HealthKit 数据库被加密。这意味着当设备要求您输入密码/指纹(大多数设备已启用)时,您根本无法从中读取任何数据。所以不幸的是,即使您能够每分钟在后台运行一些东西,您也无法读取数据(您的查询只会返回错误而不是任何结果)。

但是,仍然可以从计步器访问步数数据(此数据未加密)。我建议您考虑使用它而不是 HealthKit 进行任何后台处理。

现在听起来您真的只需要检查用户是否在过去一小时内采取了措施。如果您只经常检查而不是每分钟检查一次,效率会高得多。如果您的应用可以访问设置了推送通知的服务器,您可以安排静默推送通知以在后台唤醒您的应用,并每小时从计步器中进行一次步数检查。

【讨论】:

  • 谢谢你,你提出了一个很好的观点。我想知道为什么它在屏幕锁定时崩溃......
【解决方案2】:

您可以使用 HKObserverQuery:一个长时间运行的查询,用于监控 HealthKit 商店,并在匹配的样本被保存到 HealthKit 商店或从中删除时更新您的应用。

1.首先设置你的观察者查询

let sampleType =
HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierStepCount)

let query = HKObserverQuery(sampleType: sampleType, predicate: nil) {
query, completionHandler, error in

if error != nil {

    // Perform Proper Error Handling Here...
    println("*** An error occured while setting up the stepCount observer. \(error.localizedDescription) ***")
    abort()
}

// 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()
}
healthStore.executeQuery(query)`

2.然后注册接收后台交付

通过调用 HealthKit 商店的 enableBackgroundDelivery(for:frequency:withCompletion:) 方法注册以在后台接收更新。您可以根据需要设置适当的更新频率。

只要指定类型的新样本保存到商店,HealthKit 就会唤醒您的应用。如果您计划支持后台交付,请在您的应用程序委托的 application(_:didFinishLaunchingWithOptions:) 方法中设置所有观察者查询。通过在 application(_:didFinishLaunchingWithOptions:) 中设置查询,您可以确保在 HealthKit 交付更新之前查询已实例化并可以使用。

更多信息请查看来源:https://developer.apple.com/documentation/healthkit/hkobserverquery

【讨论】:

  • 如果应用程序正在测量不活动状态,我不确定这会有所帮助,因为这只会在有活动(而不是不活动)时唤醒应用程序?
猜你喜欢
  • 2018-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-02
  • 1970-01-01
  • 2020-01-06
  • 2014-12-14
  • 1970-01-01
相关资源
最近更新 更多