【问题标题】:Apple HealthKit - background updates not triggeringApple HealthKit - 后台更新未触发
【发布时间】: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


【解决方案1】:

您所拥有的应该可以工作,但我在 iOS 8.4 和 Xcode 6.4 之前使用模拟器的经验是不会触发后台更新。但是,在我的测试中,这确实适用于设备。要亲自尝试,请在设备上连接并运行您的应用,然后切换到 Health.app 并添加相关数据点。

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

根据文档,查询在单独的后台线程上运行,因此您的 appdelegate 代码只会在初始启动时被调用。

【讨论】:

    【解决方案2】:

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

    某些数据类型(例如步数)的最低频率为 HKUpdateFrequencyHourly。这个频率是透明地执行的。

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

    【讨论】:

      猜你喜欢
      • 2016-04-05
      • 2015-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-02
      • 2016-10-13
      • 1970-01-01
      相关资源
      最近更新 更多