HealthKit не запускает приложение при добавлении новых данных и настройке hkObserverQuery

Я пытаюсь, чтобы HealthKit запускал мое приложение при появлении новых данных. Поэтому я попытался использовать HKObserverQuery с фоновой доставкой, следуя этому примеру, который я нашел на GitHub.

У меня включена возможность фоновых режимов для моего проекта, и я убедился, что в "Обязательных фоновых режимах" в Info.plist есть только 1 элемент

Я использую Xcode и IOS 10. Я действительно понимаю, что для определенных типов данных существует ограничение по времени, поэтому я проверил это, добавив полеты в приложение для проверки работоспособности на симуляторе и проверил, вызывается ли метод печати. Но ничего не происходит. Я также попытался установить точки останова в методе application() в AppDelegate, но он выполняется только при первом запуске приложения. Он не вызывается после того, как я поместил записи в приложение здоровья.

Что я здесь не так делаю? Или есть какой-нибудь способ узнать, пытается ли Healthkit запустить мое приложение?

вот мой AppDelegate и другие соответствующие файлы

class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?
let manager = HealthKitManager()

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    manager.hkAccessor.setUpObserverQuery(){ samples in
        for sample in samples!{
            print("\(sample.value) \(sample.identifier)")
        }
    }
    return true
}

HealthkitAccessor:

func setUpObserverQuery(completion:@escaping ([QuantitySample]?) -> ()) {
    for type in getDataTypesToRead() {
        guard let sampleType = type as? HKSampleType else { print("\(type) is not an HKSampleType"); continue }
        let query = HKObserverQuery(sampleType: sampleType, predicate: nil) {
            [weak self] query, completionHandler, error in
            if error != nil {
                print("*** An error occured. \(error!.localizedDescription) ***")
                return
            }
            guard let strongSelf = self else { return }
            strongSelf.queryForDataType(type:type) { samples in
                completion(samples)
            }
            completionHandler()
        }
        executeQuery(query: query)
        healthStore.enableBackgroundDelivery(for: type, frequency: .immediate) { (success: Bool, error: Error?) in
            if success{
                print("\(type) registered for background delivery")
            }
            else {
                print("\(type) registered for background delivery")
            }
        }
    }
}

1 ответ

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

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