我正试图从传感器实时获取心率值。下面的代码激活了锻炼会话(我可以在手表上看到它),HR传感器亮起,所以它显然正常工作,但我无法访问值updateHeartRate()
方法总是返回"没有检测到HR"。有谁知道如何解决这个问题?
let healthStore = HKHealthStore()
var workoutActive = false
var workoutSession : HKWorkoutSession?
let heartRateUnit = HKUnit(fromString: "count/min")
var anchor = HKQueryAnchor(fromValue:
Int(HKAnchoredObjectQueryNoAnchor))
func workoutSession(workoutSession: HKWorkoutSession, didChangeToState toState: HKWorkoutSessionState, fromState: HKWorkoutSessionState, date: NSDate) {
switch toState {
case .Running:
workoutDidStart(date)
case .Ended:
workoutDidEnd(date)
default:
print("Unexpected state \(toState)")
}
}
func workoutSession(workoutSession: HKWorkoutSession, didFailWithError error: NSError) {
// Do nothing for now
NSLog("Workout error: \(error.userInfo)")
}
func workoutDidStart(date : NSDate) {
print("Workout did start")
if let query = createHeartRateStreamingQuery(date) {
print("Using query")
healthStore.executeQuery(query)
} else {
print("cannot start")
}
}
func workoutDidEnd(date : NSDate) {
if let query = createHeartRateStreamingQuery(date) {
healthStore.stopQuery(query)
} else {
}
}
func startBtnTapped() {
if (self.workoutActive) {
//finish the current workout
self.workoutActive = false
print("Finishing Workout")
if let workout = self.workoutSession {
healthStore.endWorkoutSession(workout)
}
} else {
//start a new workout
self.workoutActive = true
startWorkout()
print("Starting Workout")
}
}
func startWorkout() {
self.workoutSession = HKWorkoutSession(activityType: HKWorkoutActivityType.CrossTraining, locationType: HKWorkoutSessionLocationType.Indoor)
self.workoutSession?.delegate = self
healthStore.startWorkoutSession(self.workoutSession!)
}
func createHeartRateStreamingQuery(workoutStartDate: NSDate) -> HKQuery? {
let predicate = HKQuery.predicateForSamplesWithStartDate(workoutStartDate, endDate: nil, options: HKQueryOptions.None)
print("Entered query")
guard let quantityType = HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeartRate) else { return nil }
let heartRateQuery = HKAnchoredObjectQuery(type: quantityType, predicate: nil, anchor: anchor, limit: Int(HKObjectQueryNoLimit)) { (query, sampleObjects, deletedObjects, newAnchor, error) -> Void in
self.updateHeartRate(sampleObjects)
print("Query is configured")
}
heartRateQuery.updateHandler = {(query, samples, deleteObjects, newAnchor, error) -> Void in
self.updateHeartRate(samples)
print("Updating sample")
print(samples)
}
return heartRateQuery
}
func updateHeartRate(samples: [HKSample]?) {
print("Entered updateHR")
guard let heartRateSamples = samples as? [HKQuantitySample] else {
print("No HR detected")
return
}
dispatch_async(dispatch_get_main_queue()) {
print("Enter async")
guard let sample = heartRateSamples.first else{return}
let value = sample.quantity.doubleValueForUnit(self.heartRateUnit)
print(String(UInt16(value)))
// retrieve source from sample
print(sample.sourceRevision.source.name)
}
}
答案 0 :(得分:0)
您是否已请求授权从HealthKit读取心率样本? 如果没有,您的查询很可能会收到描述问题的错误。尝试检查初始结果处理程序和更新处理程序块中的错误。