在几秒钟内多次调用 Healthkit 后台交付

Posted

技术标签:

【中文标题】在几秒钟内多次调用 Healthkit 后台交付【英文标题】:Healthkit Background Delivery Calling Multiple Times in seconds 【发布时间】:2020-05-15 01:38:05 【问题描述】:

我有一个应用程序运行以下代码,以在应用程序处于后台/暂停/终止时每小时获取 Healthkit 数据,并且它根据需要每小时运行一次而不会失败。从 appdelgate 调用代码

didFinishLaunchingWithOptions

然而,它实际上是在不到一秒的时间内每小时触发 3-6 次查询,因此数据访问我的服务器的次数是需要的 3-6 倍。

我已经阅读了很多关于 Health Kit 后台交付的问题,但似乎没有一个涵盖这个问题。

我读到这可能是因为我每次都在注册后台刷新,我应该检查我是否已经注册而不是重新注册,但我不知道如何检查并且找不到任何文档甚至提到了这个过程的参考资料。鉴于代码每小时运行的次数如此多变,我也不知道这是否是问题。

任何帮助将不胜感激。

 func startObservingKJ() 
     print("BG Code Called")
     let KJQuantityType = HKQuantityType.quantityType(forIdentifier: .activeEnergyBurned)!
     self.healthStore.enableBackgroundDelivery(for: KJQuantityType, frequency: .hourly)  (success, error) in
         if let unwrappedError = error 
             print("could not enable background delivery KJ: \(unwrappedError)")
         
         if success 
             print("background delivery enabled KJ")
         
     


     let query = HKObserverQuery(sampleType: KJQuantityType, predicate: nil)  (query, completionHandler, error) in


        self.updateKJandSteps() 
             completionHandler()
         


     
     healthStore.execute(query)
 

【问题讨论】:

【参考方案1】:

我终于意识到该查询多次使self.updateKJandSteps() 令人兴奋,因为该查询返回了多个条目。我添加了一项检查以确保 self.updateKJandSteps() 尚未运行,这解决了问题,现在只进行了一次更新。

【讨论】:

你能解释一下你是怎么做到的吗?我遇到了同样的问题,我的观察者查询每添加到 HealthKit 的每一步记录都会触发一次它的处理程序,并导致大量静态记录最终被我的服务器作为重复项忽略。

以上是关于在几秒钟内多次调用 Healthkit 后台交付的主要内容,如果未能解决你的问题,请参考以下文章

HealthKit 后台交付在一分钟内运行多次

HealthKit 后台交付在一分钟内运行多次

HealthKit 后台交付

如何使用 HealthKit 后台交付?

应用程序终止时的 Healthkit 后台交付

应用程序终止时的 Healthkit 后台交付