HKObserverQuery 仅在应用程序重新打开时运行

Posted

技术标签:

【中文标题】HKObserverQuery 仅在应用程序重新打开时运行【英文标题】:HKObserverQuery only runs when the application is reopened 【发布时间】:2017-07-23 20:17:42 【问题描述】:

所以我一直按照这个答案中的说明进行操作...... Healthkit background delivery when app is not running

代码运行良好并且在应用程序打开时工作,并说后台交付成功,但是当我通过四处走动并将设备上的时钟更改为一个小时前来测试应用程序时,我没有收到任何日志让我知道它已经运行了。但是,如果我再次打开应用程序,观察者查询就会运行。

private func checkAuthorization()
    let healthDataToRead = Set(arrayLiteral: self.distanceQuantityType!)


    healthKitStore.requestAuthorization(toShare: nil, read: healthDataToRead)  (success, error) in
        if error != nil 
            print(error?.localizedDescription)
            print("There was an error requesting Authorization to use Health App")
        
        if success 
            print("success")

        
    


public func enableBackgroundDelivery() 

    self.checkAuthorization()
    self.healthKitStore.enableBackgroundDelivery(for: self.distanceQuantityType!, frequency: .hourly)  (success, error) in
        if success
            print("Background delivery of steps. Success = \(success)")

        

        if let error = error 
            print("Background delivery of steps failed = \(error.localizedDescription)")
        
    





func observeDistance(_ handler:@escaping (_ distance: Double) -> Void) 

    let updateHandler: (HKObserverQuery?, HKObserverQueryCompletionHandler?, Error?) -> Void =  query, completion, error in
        if !(error != nil) 
            print("got an update")
            completion!()
         else 
            print("observer query returned error: \(error)")
        
    

    let query = HKObserverQuery(sampleType: self.distanceQuantityType!, predicate: nil, updateHandler: updateHandler)
    self.healthKitStore.execute(query)

查询在appDelegate方法didFinishLaunching中初始化

【问题讨论】:

【参考方案1】:

这个特定的 HealthKitQuery 是异步的。您应该等到它完成处理。

但是,这种情况在didFinishLaunching 中是不可能的。应用程序刚刚结束执行,没有足够的时间来处理查询。

我会认真建议重新考虑代码操作背后的逻辑。解决此问题的一个好方法是将请求放在其他地方,最好是在完成所需的操作之后。

【讨论】:

根据文档,观察者查询应始终在 didFinishLaunching 中初始化。我觉得有某种错误阻止了代码在后台运行,因为当再次打开应用程序时它可以完美运行。

以上是关于HKObserverQuery 仅在应用程序重新打开时运行的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5 GUI 仅在单击屏幕并重新打开时更新

HKObserverQuery 连续两次随机调用

添加新数据并设置 hkObserverQuery 时,HealthKit 不启动应用程序

HealthKit HKObserverQuery 没有持续触发

从 HKObserverQuery 获取结果

iOS : HKObserverQuery 的后台更新completionHandler 的使用