HKAnchoredObjectQuery updateHandler вызывается только один раз

У меня есть ViewController в приложении для iPhone:

class ViewController: UIViewController {
    private let healthStore = HKHealthStore()
    private let heartRateUnit = HKUnit(fromString: "count/min")
    private var anchor = HKQueryAnchor(fromValue: Int(HKAnchoredObjectQueryNoAnchor))

    override func viewDidLoad() {
        super.viewDidLoad()

        if let query = createHeartRateStreamingQuery(NSDate()) {
            healthStore.executeQuery(query)
        }
    }

     func createHeartRateStreamingQuery(workoutStartDate: NSDate) -> HKQuery? {
        guard let quantityType = HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeartRate) else { return .None }

        let heartRateQuery = HKAnchoredObjectQuery(type: quantityType, predicate: nil, anchor: anchor, limit: Int(HKObjectQueryNoLimit)) { (query, sampleObjects, deletedObjects, newAnchor, error)  in }

        heartRateQuery.updateHandler = {(query, samples, deleteObjects, newAnchor, error) in
            self.updateHeartRate(samples)
        }

        return heartRateQuery
    }

Но heartRateQuery.updateHandler звонит только один раз, пока я использую приложение Workout.

Похоже на ту же ошибку - https://forums.developer.apple.com/thread/14571 и Контролировать частоту сердечных сокращений из HealthKit — › HKAnchoredObjectQuery вызывается только после applicationDidBecomeActive (ОШИБКА или ФУНКЦИЯ?)


person Arsen    schedule 07.12.2015    source источник


Ответы (2)


Вам необходимо включить фоновую доставку для вашего типа пробы (частота сердечных сокращений). Поиск метода

HKHealthStore.enableBackgroundDeliveryForType()

Я выполняю этот метод до

HKHealthStore.executeQuery().
person steve1951    schedule 13.12.2015

Обновление: Swift 5

Вы можете указать ObjectType и как часто вы хотите, чтобы он срабатывал.

HKHealthStore.enableBackgroundDelivery(for: HKObjectType, frequency: HKUpdateFrequency.immediate) 
person Mohammad    schedule 07.06.2021