背景模式下的HKObserverQuery

时间:2017-06-14 22:21:44

标签: ios iphone swift apple-watch health-kit

我的应用程序需要跟踪来自Apple Watch的用户心率读数,因此我完成了在Apple指南中找到的所有必需步骤,这是我正在使用的代码:

static var query: HKObserverQuery?

    func startObservingHeartRate() {

        guard let heartRateSampleType = HKObjectType.quantityType(forIdentifier: HKQuantityTypeIdentifier.heartRate) else {

            fatalError("Unable to create a step count sample type")

        }



        AppDelegate.query = HKObserverQuery(sampleType: heartRateSampleType, predicate: nil, updateHandler: { (query, completionHandler, error) in

                if error != nil {

                    // Perform Proper Error Handling Here...
                    print("An error occured while setting up the Heart Rate observer.")

                }

                //Read the last strored heatt rate in add it to the DB
                //Add last fetched Heart Rate reading to DB and send it to clips
                HealthKitManager().fetchLastStoredHeartRate(completion: { (lastReading, error) in

                    guard let lastReading = lastReading else {

                        //There is no heart readings in HealthKit
                        return

                    }

                    //Check if Last HR value is Abnormal
                    if lastReading.doubleValue > 60 {

                        //TODO: - Schedule notification
                        if UIApplication.shared.applicationState == .background {



                        } else {

                        //TODO: - Show popup to the user

                        }

                    }

                })

                completionHandler()

        })

        healthKitStore.execute(AppDelegate.query!)

        configureHeartRateObserver()

    }

    func configureHeartRateObserver() {

        guard let heartRateSampleType = HKObjectType.quantityType(forIdentifier: HKQuantityTypeIdentifier.heartRate) else {

            fatalError("Unable to create a step count sample type")

        }   

        healthKitStore.enableBackgroundDelivery(for: heartRateSampleType, frequency: HKUpdateFrequency.immediate) { (success, error) in

            if success {

                print("Enabled background delivery of Heart Rate changes")

            } else {

                print("Failed to enable background delivery of weight changes. ")

            }

        }

    }

我在AppDelegate中的didFinishLaunchingWithOptions中调用“startObservingHeartRate”,假设一旦从健康工具包商店添加或删除新读数就应该执行此查询,每件事情都没问题,如果应用程序处于后台或者处理程序唤醒我的应用程序,它进行更新。

但每当我把应用程序放在后台然后再次将它放在前台时它会多次执行观察者查询,即使没有新的读数添加到HealthKit商店,在这种情况下,我获得相同的最后一次心率很多次没有理由。

请提供有关如何使用此类查询的建议或我当前实施所需的任何更改。

1 个答案:

答案 0 :(得分:1)

如果您想更精确地追踪添加和删除的心率样本,您应该使用HKAnchoredObjectQueryHKObserverQuery不保证仅在添加或删除样本时才会调用其更新处理程序。请注意,除了HKObserverQuery之外,您还必须继续执行HKAnchoredObjectQuery,因为您还在使用enableBackgroundDelivery(for:frequency:completion:)