【问题标题】:How to store ECG data on apple healthkit?如何将心电图数据存储在 Apple Healthkit 上?
【发布时间】:2019-04-21 21:52:54
【问题描述】:

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

如果我想通过使用来创建上述内容,我会错吗

struct HKClinicalTypeIdentifier

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

static let labResultRecord: HKClinicalTypeIdentifier

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

【问题讨论】:

  • 由于手表具有心电图功能,因此必须有苹果的方式来存储和使用这些数据,而无需定义自己的类型。不过,文档比 Apple 通常糟糕的标准还要糟糕。
  • 所以我认为作为 T​​ypeIdentifier 的 ECG 目前在 HealthKit API 中缺失。当然,看看苹果提供的心电图功能截图,它看起来在健康应用程序中会有自己的部分,例如心率、心率变异性和最大摄氧量。我怀疑 WatchOS 5.1.2 也会有一个新的 iOS 版本变化。这些可能会添加 api 调用。奇怪的是,Apple 没有首先将这些更改纳入测试版以允许开发人员在他们的应用程序中获得支持。

标签: ios swift3 healthkit


【解决方案1】:

我找到了上述问题的替代解决方案。我写这篇文章是为了如果有人有类似的问题可以在需要时采取类似的方法。 基本上在写这篇文章的时候,还没有 ECG typeIdentifier 可供开发人员使用。然而,绕过它的方法是创建一个 HKQauntiySample 对象并将 ECG 值作为元数据传递。但我面临这种方法的唯一问题是与实时/历史 ECG 可以保存到 healthkit 中的速率有关。

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

【讨论】:

  • ECG 数据实际上存储在 healthkit 中,现在是否有更好/正确的解决方案?
  • 还没有德米特里。 Apple 尚未发布 ECG 的类型标识符。我正在使用元数据来存储心电图数据。这只是一种 hack,永远不能被视为生产解决方案。
  • 您知道 Healthkit 中是否有任何更改以添加类型标识符?
  • Xcode 12 的 iOS 14 beta 中添加了类型标识符
【解决方案2】:

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

HKElectrocardiogramQuery Apple Documentation

这是我用来检索心电图数据的示例代码:

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
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多