在后台 swift 中定期检查 healthkit 数据

owl*_*ipe 2 iphone ios swift healthkit swift2

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

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

小智 6

您可以使用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)`
Run Code Online (Sandbox Code Playgroud)

2.然后注册接收后台发货

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

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

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


leh*_*058 5

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

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

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