apple healthkit如何存储心电数据?

How to store ECG data on apple healthkit?

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

如果我想使用

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

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

static let labResultRecord: HKClinicalTypeIdentifier

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

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

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

在 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
    }