我正在尝试执行一些由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,但是当应用程序失焦时,它永远不会被调用。我已经四处寻找并找到了一些想法,但是没有任何修复似乎对我有用。
谢谢!
答案 0 :(得分:1)
你有什么应该工作,但我通过iOS 8.4和Xcode 6.4的模拟器的经验是没有触发后台更新。但是,在我的测试中,这确实适用于设备。要自己尝试,请在设备上连接并运行您的应用,然后切换到Health.app并添加相关数据点。
如果您的查询设置为立即更新,您应该在控制台中看到您的日志消息。确保stepsChangedHandler
包含completionHandler()
。
根据文档,查询在单独的后台线程上运行,因此只有在首次启动时才会调用appdelegate代码。
答案 1 :(得分:1)
在HKHealthStore类的文档中,在enableBackgroundDeliveryForType:...下有一段:
某些数据类型(例如步数)的最小频率为HKUpdateFrequencyHourly。此频率是透明执行的。
这解释了为什么您不会像指定的那样频繁地看到后台更新。我不确定是否列出了哪些数据类型包含在"某些"量词。