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

Posted

技术标签:

【中文标题】添加新数据并设置 hkObserverQuery 时,HealthKit 不启动应用程序【英文标题】:HealthKit does not launch app when new data is added and hkObserverQuery is set up 【发布时间】:2017-11-29 02:18:48 【问题描述】:

每当有新数据可用时,我都会尝试让 HealthKit 启动我的应用程序。因此,我尝试按照我找到on GitHub 的这个示例将HKObserverQuery 与后台交付一起使用。

我为我的项目启用了背景模式功能,并确保 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】:

经过 12 个小时的尝试,我发现我所拥有的确实有效。只是不在模拟器上。它可以在真实设备上运行,但有一些延迟,这是合理的。我看到有人说 HealthKit 不能在数据更新后立即通知你的应用程序,而是找到系统不忙的机会唤醒你的应用程序。

【讨论】:

以上是关于添加新数据并设置 hkObserverQuery 时,HealthKit 不启动应用程序的主要内容,如果未能解决你的问题,请参考以下文章

HealthKit HKObserverQuery 没有持续触发

从 HKObserverQuery 获取结果

HKObserverQuery 后台传递在调用completionHandler 后停止工作

HKObserverQuery 无法在 iPhone 上运行

iOS : HKObserverQuery 的后台更新completionHandler 的使用

HKObserverQuery 仅在应用程序重新打开时运行