Apple HealthKit - 不触发后台更新

时间:2015-06-30 14:45:42

标签: ios swift background health-kit

我正在尝试执行一些由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,但是当应用程序失焦时,它永远不会被调用。我已经四处寻找并找到了一些想法,但是没有任何修复似乎对我有用。

谢谢!

2 个答案:

答案 0 :(得分:1)

你有什么应该工作,但我通过iOS 8.4和Xcode 6.4的模拟器的经验是没有触发后台更新。但是,在我的测试中,这确实适用于设备。要自己尝试,请在设备上连接并运行您的应用,然后切换到Health.app并添加相关数据点。

如果您的查询设置为立即更新,您应该在控制台中看到您的日志消息。确保stepsChangedHandler包含completionHandler()

根据文档,查询在单独的后台线程上运行,因此只有在首次启动时才会调用appdelegate代码。

答案 1 :(得分:1)

在HKHealthStore类的文档中,在enableBackgroundDeliveryForType:...下有一段:

  

某些数据类型(例如步数)的最小频率为HKUpdateFrequencyHourly。此频率是透明执行的。

这解释了为什么您不会像指定的那样频繁地看到后台更新。我不确定是否列出了哪些数据类型包含在"某些"量词。