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