2016-04-15 96 views
1

我想使用HealthKit API编程心率监视器。HKObserverQuery,后台更新和隐私政策

我有一个极地H7,它正在将数据写入健康商店。我使用HKObserverQuery(没有丢失对completionHandler()的调用),HKSampleQuery以及为我正在查询的类型启用背景更新调用HKHealthStore.enableBackgroundDeliveryForType来实现我的目标。

private func queryForHeartRate() { 

    guard let sampleType = HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeartRate) else { 
     executeCompletionHandler(value: nil, error: nil) 
     return 
    } 

    let observerQuery = HKObserverQuery(sampleType: sampleType, predicate: nil) { [unowned self] query, completionHandler, error in 

     guard error == nil else { 
      self.executeCompletionHandler(value: nil, error: error) 
      return 
     } 

     self.queryHeartRateSample(sampleType) 
     completionHandler() 
    } 

    healthStore.executeQuery(observerQuery) 
} 

private func queryHeartRateSample(sampleType: HKSampleType) { 

    let timeSortDescriptor = NSSortDescriptor(key: HKSampleSortIdentifierEndDate, ascending: false) 
    let sampleQuery = HKSampleQuery(sampleType: sampleType, predicate: nil, limit: 1, sortDescriptors: [timeSortDescriptor], resultsHandler: { [unowned self] (sampleQuery, results, error) in 

     guard error == nil else { 
      self.executeCompletionHandler(value: nil, error: error) 
      return 
     } 

     guard let samples = results as? [HKQuantitySample] where !samples.isEmpty else { 
      self.executeCompletionHandler(value: nil, error: error) 
      return 
     } 

     guard let lastSample = samples.last else { 
      self.executeCompletionHandler(value: nil, error: error) 
      return 
     } 

     let heartBeat = lastSample.quantity.doubleValueForUnit(self.heartBeatsPerMinuteUnit) 
     self.executeCompletionHandler(value: heartBeat, error: nil) 
    }) 

    healthStore.executeQuery(sampleQuery) 
} 

但是,当应用程序被切换到后台或者我锁定手机(即时密码)的应用程序停止接收更新。

docs我看到:

的HealthKit数据仅在用户的设备上本地保存。为了安全起见,HealthKit商店在设备被锁定时被加密。 HealthKit商店只能由授权的应用访问。因此,当您的应用在后台启动时,您可能无法从商店读取数据;不过,应用程序仍然可以将数据写入商店,即使手机已锁定。 HealthKit暂时缓存数据,并将其尽快手机被解锁

但是保存到数据存储库中,当我使用Runstastic,我收到的时候我改变心脏地带声音建议; Nike + Running以同样的方式跟踪所有心率。这个隐私政策怎么可能?

我有点迷路了,文档有点混淆了需要什么来接收背景/锁定更新(如果可能)。我在这里阅读了所有相关的答案,但没有一个是确凿的,而具有更多信息的那个,this提到了后台提取,这是文档中未提及的东西。

是否有任何资源或教程如何实现这一目标?甚至有可能吗?有Runtastic或类似的应用程序解决方法吗?

非常感谢。

回答

1

当设备被锁定时,您的应用程序无法接收HealthKit数据,因为当时数据已加密且无法访问。当设备被锁定时,响应心率变化的其他应用程序很可能直接从BT心率监视器读取数据,而不是HealthKit。

+0

这就是我所假设的,所以我会实现一种方法来使用BTLE从传感器获取节拍。 谢谢! – emenegro

+0

我对BLE的经验是,在一定的后台执行时间之后,连接到设备的连接会丢失。约。在后台4小时iOS将终止与您的BLE连接的应用程序,导致没有更多的监视器更新。你有更可靠的BLE连接经验吗? – Chris