我正在为启用HealthKit的iOS应用程序编写一个不活动警报。当用户在过去60分钟内完成少于100步时,根据运行状况中的数据,它会发送通知。当应用程序打开时,这非常有效,但是我在后台工作时遇到了一些麻烦。我已经尝试获取步骤数据以及本教程中描述的后台位置检查程序(https://www.raywenderlich.com/92428/background-modes-ios-swift-tutorial),但由于某些原因,当教程的程序在真正的iPhone上运行时,位置数据不再在后台收集。
所以,我的问题是:我的应用程序如何在后台每分钟可靠地检查健康数据,即使应用程序已关闭数天?
答案 0 :(得分:2)
设备锁定时,HealthKit数据库已加密。这意味着当设备要求您输入密码/指纹(大多数设备已启用)时,您根本无法从中读取任何数据。所以不幸的是,即使你能够在后台每分钟运行一些东西你也无法读取数据(你的查询只会返回错误而不是任何结果)。
但是,仍然可以从计步器访问步骤数据(此数据未加密)。我建议您使用它而不是HealthKit进行任何后台处理。
现在听起来你真的只需要检查用户是否在过去一小时内采取了措施。如果你只经常检查而不是每分钟都会更有效率。如果您的应用可以访问具有推送通知设置的服务器,您可以安排静音推送通知,以便在后台唤醒您的应用,并每小时从计步器进行一次步骤检查。
答案 1 :(得分:1)
您可以使用 HKObserverQuery :这是一个长时间运行的查询,用于监视HealthKit存储并在将匹配的样本保存到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