我是IOS应用开发的新手。我一直在尝试学习如何使用Apple HealthKit API。到目前为止,作为一个实验,我设法构建了一个简单的应用程序,该应用程序可以存储和检索来自HealthKit的数据,例如血型,心率等(如果有人需要,我可以提供代码-互联网上已经可用) 。我能够执行此功能,因为healthkitStore为应用程序开发人员公开了这些typeIdentifiers。但是,当我想创建一个新的typeIdentifier以便将ECG / EKG存储在healthKit上时,我有点迷失了?我想将ECG / EKG信号输入到我的应用程序中,并使用HealthKitStore保存这些信息。我错过了什么吗?我知道我很慢,但是我在互联网上进行了很多搜索,但是找不到任何具体的解决方案。这不可能吗?但是向开发人员开放API的全部目的是创建具有不同功能的新应用。 就存储和检索ECG数据而言,我没有特定的要求,因为我只是想创建一个没有任何约束,而是专注于功能的PoC。
如果我想使用
创建以上内容,我会错吗struct HKClinicalTypeIdentifier
然后使用临床记录类型标识符
static let labResultRecord: HKClinicalTypeIdentifier
这是正确的方向吗? 任何方向,动机或批评都非常受欢迎。
答案 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
}