HKSampleQuery查询HKSeriesType.workoutRoute无结果问题求助
问题
尝试从跑步Workout中获取底层GPS点,但无法找到对应的Workout路线数据。fetchRunningWorkouts函数可正常执行完成,但调用fetchRunningWorkoutRoute时返回无数据。设备上存在跑步记录,且已获取所需查询权限,调用了KHealthStore().execute()。相关代码如下:
func fetchRunningWorkouts() { // 创建筛选跑步Workout的谓词 let workoutPredicate = HKQuery.predicateForWorkouts(with: .running) // 创建查询跑步Workout的请求 let workoutQuery = HKSampleQuery( sampleType: HKWorkoutType.workoutType(), predicate: workoutPredicate, limit: 8, sortDescriptors: nil ) { (query, samples, error) in fetchRunningWorkoutRoute(workout: workout) // ... 其他代码 } }
func fetchRunningWorkoutRoute(workout: HKWorkout) { let workoutRouteQuery = HKSampleQuery( sampleType: HKSeriesType.workoutRoute(), predicate: HKQuery.predicateForObjects(from: workout), limit: HKObjectQueryNoLimit, sortDescriptors: nil ) { (query, samplesOrNil, errorOrNil) in guard errorOrNil == nil else { print("HealthKit 查询错误: \(errorOrNil!.localizedDescription)") return } guard let samples = samplesOrNil as? [HKWorkoutRoute], let route = samples.first else { print("HealthKit 中未找到Workout路线。") return } // ... 其他代码 } }
可能的原因与解决办法
- 代码逻辑错误:在
fetchRunningWorkouts的查询回调中,workout变量未定义。正确做法是先将samples转换为[HKWorkout]类型,再遍历或取出具体的Workout对象传入fetchRunningWorkoutRoute,示例修正:guard let workouts = samples as? [HKWorkout], !workouts.isEmpty else { return } for workout in workouts { fetchRunningWorkoutRoute(workout: workout) } - Workout本身无路线数据:并非所有跑步记录都包含GPS路线,手动输入的Workout、未开启GPS的设备记录都不会生成路线数据。可以先在健康App中确认目标跑步记录是否显示路线地图。
- 权限未正确配置:确保已请求
HKSeriesType.workoutRoute()的读取权限,Workout类型的权限和路线类型的权限是独立的,需要分别申请。 - 查询执行缺失:检查
workoutRouteQuery是否通过healthStore.execute(query: workoutRouteQuery)执行,仅定义查询不会触发数据请求。 - 谓词补充过滤:可以在谓词中补充时间范围,确保与目标Workout的时间匹配,避免查询范围过大:
let predicate = NSCompoundPredicate(andPredicateWithSubpredicates: [ HKQuery.predicateForObjects(from: workout), HKQuery.predicateForSamples(withStart: workout.startDate, end: workout.endDate, options: .strictStartDate) ])
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

