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
}
我是 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
}