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