【发布时间】:2015-06-30 14:45:42
【问题描述】:
我正在尝试执行一些由 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,但当应用程序失去焦点时它永远不会被调用。我四处搜索并找到了一些想法,但似乎没有一个修复对我有用。
谢谢!
【问题讨论】:
-
我也想知道如何成功地做到这一点。有谁知道 HealthKit 唤醒后台应用程序的应用程序生命周期? appdelegate 是否被实例化?我开始认为只运行观察者查询的 updateHandler。
-
@barnone - 我在 updateHandler 中放了一个 println 以查看在后台是否发生了任何事情,但它从未在 Xcode 控制台上显示,但也许那些不是那样工作的?跨度>
-
@barnone - 我在这里发布了一个解释生命周期的答案:stackoverflow.com/questions/31117630/…
-
@goldengil 谢谢。我也让它工作。我想更大的问题是......大多数更新发生在手机被锁定时(因此无法提取数据)。有什么想法可以告诉 iPhone 在解锁后重试吗?
标签: ios swift background healthkit