You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 14:57:32