我正在尝试执行一些由 Apple Health Kit 更改触发的操作,这些操作在我的 Swift iOS 应用程序的后台触发。
这是我的 AppDelegate:
var healthManager : HealthManager?
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
healthManager = HealthManager.sharedInstance
return true
}
在 HealthManager 类的初始化中,我授权使用 Health Kit 并调用:
var sampleType = HKQuantityType.quantityTypeForIdentifier(HKQuantityTypeIdentifierStepCount)
var predicate = HKQuery.predicateForSamplesWithStartDate(startDate, endDate: endDate, options: HKQueryOptions.StrictStartDate)
var query = HKObserverQuery(sampleType: sampleType, predicate: predicate, updateHandler: stepsChangedHandler)
healthKitStore.executeQuery(query)
healthKitStore.enableBackgroundDeliveryForType(sampleType, frequency: .Immediate, withCompletion: {(succeeded, error) in
if succeeded {
println("Enabled background delivery of step changes")
} else {
if let theError = error {
print("Failed to enable background delivery of step changed. ")
println("Error = \(theError)")
}
}
})
当应用程序打开时,这工作得很好 - 当有健康套件更新时,将调用stepsChangedHandler,但当应用程序失去焦点时,它永远不会被调用。我四处搜寻并找到了一些想法,但似乎没有一个修复方法对我有用。
谢谢!
最佳答案
你所拥有的应该可以工作,但我在 iOS 8.4 和 Xcode 6.4 之前使用模拟器的经验是,不会触发后台更新。然而,在我的测试中,这确实可以在设备上运行。要亲自尝试,请在设备上连接并运行您的应用程序,然后切换到 Health.app 并添加相关数据点。
如果您的查询设置为立即更新,您应该在控制台中看到日志消息。确保 stepsChangedHandler
包含 completionHandler()
。
根据文档,查询在单独的后台线程上运行,因此您的 appdelegate 代码只会在初始启动时调用。
关于ios - Apple HealthKit - 后台更新未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31141487/