如何在Apple Healthkit上存储ECG数据?

时间:2018-11-19 14:02:24

标签: ios swift3 health-kit

我是IOS应用开发的新手。我一直在尝试学习如何使用Apple HealthKit API。到目前为止,作为一个实验,我设法构建了一个简单的应用程序,该应用程序可以存储和检索来自HealthKit的数据,例如血型,心率等(如果有人需要,我可以提供代码-互联网上已经可用) 。我能够执行此功能,因为healthkitStore为应用程序开发人员公开了这些typeIdentifiers。但是,当我想创建一个新的typeIdentifier以便将ECG / EKG存储在healthKit上时,我有点迷失了?我想将ECG / EKG信号输入到我的应用程序中,并使用HealthKitStore保存这些信息。我错过了什么吗?我知道我很慢,但是我在互联网上进行了很多搜索,但是找不到任何具体的解决方案。这不可能吗?但是向开发人员开放API的全部目的是创建具有不同功能的新应用。 就存储和检索ECG数据而言,我没有特定的要求,因为我只是想创建一个没有任何约束,而是专注于功能的PoC。

如果我想使用

创建以上内容,我会错吗
struct HKClinicalTypeIdentifier

然后使用临床记录类型标识符

static let labResultRecord: HKClinicalTypeIdentifier

这是正确的方向吗? 任何方向,动机或批评都非常受欢迎。

2 个答案:

答案 0 :(得分:1)

我找到了上述问题的替代解决方案。我写这篇文章的目的是,如果有人有类似问题,可以在需要时采取类似的方法。 基本上在编写此线程时,没有可供开发人员使用的ECG typeIdentifier。但是,解决方法是创建一个HKQauntiySample对象并将ECG值作为元数据传递。但是,我所面对的唯一问题是如何将实时/历史心电图保存到医疗包中的速率。

例如,ECG的采样频率为200 Hz。我无法使用亚秒级时间戳存储数据。它最多只能提供几秒钟的时间戳。而且,似乎可以使用上述对象存储数据的最大速率低至160Hz。也许这是接口,healtkitstore等的限制。我不知道。希望这能解决问题。

答案 1 :(得分:0)

在iOS 14中,您可以使用新的API读取ECG数据

HKElectrocardiogramQuery Apple Documentation

这是我用来检索ECG数据的示例代码:

if #available(iOS 14.0, *) {
        let predicate = HKQuery.predicateForSamples(withStart: Date.distantPast,end: Date.distantFuture,options: .strictEndDate)
        let sortDescriptor = NSSortDescriptor(key: HKSampleSortIdentifierStartDate, ascending: false)
        let ecgQuery = HKSampleQuery(sampleType: HKObjectType.electrocardiogramType(), predicate: predicate, limit: 0, sortDescriptors: [sortDescriptor]){ (query, samples, error) in
            guard let samples = samples,
                let mostRecentSample = samples.first as? HKElectrocardiogram else {
                return
            }
            print(mostRecentSample)
            var ecgSamples = [(Double,Double)] ()
            let query = HKElectrocardiogramQuery(mostRecentSample) { (query, result) in
                
                switch result {
                case .error(let error):
                    print("error: ", error)
                    
                case .measurement(let value):
                    print("value: ", value)
                    let sample = (value.quantity(for: .appleWatchSimilarToLeadI)!.doubleValue(for: HKUnit.volt()) , value.timeSinceSampleStart)
                    ecgSamples.append(sample)
                    
                case .done:
                    print("done")
                }
            }
            self.healthMonitor.healthStore.execute(query)
        }
        
        
        healthMonitor.healthStore.execute(ecgQuery)
    } else {
        // Fallback on earlier versions
    }