HKObserverQuery запускается только при повторном открытии приложения

Итак, я следовал инструкциям в этом ответе... Фоновая доставка Healthkit, когда приложение не запущено

Код работает нормально и работает, пока приложение открыто и сообщает, что фоновая доставка прошла успешно, однако, когда я тестирую приложение, обходя часы и меняя часы на устройстве на час вперед, я не получаю никаких журналов, чтобы сообщить мне об этом побежал. Однако, если я снова открою приложение, запрос наблюдателя будет запущен.

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, Приложение только что завершило выполнение, и для обработки запроса не хватает времени.

Я бы серьезно предложил переосмыслить логику работы вашего кода. Хороший способ решить эту проблему - разместить запрос в другом месте, предпочтительно после завершения необходимых операций.

Другие вопросы по тегам