我正在研究我的第一个ResearchKit项目。我试图通过苹果的HealthKit获取心率数据。我正在手机上测试程序,而且我有带健康数据的苹果手表,它应该可用。步行任务开始并成功完成,我能够解析结果文件。但我发现结果文件只包含物理传感器数据(加速度计和陀螺仪)而不包含任何健康数据。
我有点担心的是,当步行任务开始时,我在控制台输出上看到这两个警告:
ORKSample[511:80256] [ResearchKit][Warning] __82-[ORKTaskViewController requestHealthStoreAccessWithReadTypes:writeTypes:handler:]_block_invoke Health access: error=(null)
2016-04-07 16:31:28.097 ORKSample[511:80630] [ResearchKit][Warning] __59-[ORKTaskViewController requestPedometerAccessWithHandler:]_block_invoke Pedometer access: error=(null)
似乎_block_invole Health access
和_block_invoke Pedometer access
不能很好。
以下是我用于授权运行状况数据的代码:
import ResearchKit
import HealthKit
class HealthDataStep: ORKInstructionStep {
// MARK: Properties
let healthDataItemsToRead: Set<HKObjectType> = [
HKObjectType.characteristicTypeForIdentifier(HKCharacteristicTypeIdentifierDateOfBirth)!,
HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeight)!,
HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBodyMass)!,
HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeartRate)!,
HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierDistanceWalkingRunning)!
]
let healthDataItemsToWrite: Set<HKSampleType> = [
HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBodyMass)!,
HKObjectType.workoutType(),
HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeartRate)!,
HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierDistanceWalkingRunning)!
]
// MARK: Initialization
override init(identifier: String) {
super.init(identifier: identifier)
title = NSLocalizedString("Health Data", comment: "")
text = NSLocalizedString("On the next screen, you will be prompted to grant access to read and write some of your general and health information, such as height, weight, and steps taken so you don't have to enter it again.", comment: "")
}
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// MARK: Convenience
func getHealthAuthorization(completion: (success: Bool, error: NSError?) -> Void) {
guard HKHealthStore.isHealthDataAvailable() else {
let error = NSError(domain: "com.example.apple-samplecode.ORKSample", code: 2, userInfo: [NSLocalizedDescriptionKey: "Health data is not available on this device."])
completion(success: false, error:error)
return
}
// Get authorization to access the data
HKHealthStore().requestAuthorizationToShareTypes(healthDataItemsToWrite, readTypes: healthDataItemsToRead) { (success, error) -> Void in
completion(success:success, error:error)
}
}
}
为了实现步行任务,我使用这段代码,非常简单:
public var TimedWalkTask: ORKOrderedTask {
return ORKOrderedTask.fitnessCheckTaskWithIdentifier("WalkTask",intendedUseDescription: nil,walkDuration: 15 as NSTimeInterval, restDuration: 15 as NSTimeInterval,options: .None)
}
只是想知道是否有人知道我是否遗漏了什么。该程序似乎正确运行并返回结果,但结果不包含我正在寻找的健康数据。
答案 0 :(得分:1)
元是正确的 - 样本没有实时同步Apple Watch的手机,所以你不会在活动任务中拿起它们。您可能仍然可以在您的研究中执行此操作,但您需要使用历史HealthKit查询来获取与先前任务相关的样本,并在以后处理数据时将它们关联起来。
此外,除非在Apple Watch上有活动训练课程,否则心率样本将不经常收集。如果您需要更高频率的心率样本,您需要一个Watch应用程序作为您学习的一部分开始锻炼课程,或者您需要让用户在Watch上使用Workout应用程序开始锻炼任务。