添加新数据并设置hkObserverQuery时,HealthKit不会启动应用程序

时间:2017-11-29 02:18:49

标签: ios swift health-kit hkobserverquery

我正在尝试让HealthKit在有新数据时启动我的应用程序。所以我尝试使用HKObserverQuery和后台交付,这个例子我发现on GitHub

我为项目启用了后台模式功能,并确保Info.plist中所需的后台模式中只有1项

我正在使用Xcode和IOS 10.我确实意识到某些数据类型有时间限制,所以我测试了这是通过在模拟器上添加爬到健康应用程序的航班并查看是否调用了打印方法。但什么都没发生。我还尝试在AppDelegate中的application()方法中设置断点,但它仅在首次启动应用时执行。在我将条目放入健康应用程序后,它不会被调用。

我在这里做错了什么?或者有什么方法可以看看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 个答案:

答案 0 :(得分:1)

经过12个小时的尝试,我发现我实际上有所作为。只是不在模拟器上。它适用于具有一定延迟的实际设备,这是合理的。我看到有人说HealthKit在更新数据后无法立即通知您的应用,而是发现系统不忙于唤醒您的应用。