HKWorkout.init()已废弃,如何创建测试用[HKWorkout]数据?
替代废弃的HKWorkout初始化,创建测试用HKWorkout数组的最佳方式
旧版HKWorkout.init()已被废弃,要在模拟器或Xcode Preview里快速创建测试用[HKWorkout]数组,完全不需要依赖HKHealthStore,有两种简单可行的方式:
1. 使用新版HKWorkout初始化器
新版初始化器去掉了冗余的duration参数(系统会通过start和end时间自动计算时长),写法和你之前的代码几乎一致,直接就能用:
// 创建单条测试Workout数据 let workoutStartDate = Date() let duration: TimeInterval = 3600 // 1小时 let distance = 10000.0 // 10公里 let workout = HKWorkout( activityType: .running, start: workoutStartDate, end: workoutStartDate.addingTimeInterval(duration), workoutEvents: nil, totalEnergyBurned: HKQuantity(unit: .kilocalorie(), doubleValue: Double.random(in: 200...500)), totalDistance: HKQuantity(unit: .meter(), doubleValue: distance), metadata: nil ) var workouts: [HKWorkout] = [] workouts.append(workout)
2. 封装工具方法批量生成测试数据
如果需要多条不同类型的测试数据,可以写个工具函数批量生成,省得重复写代码:
func generateDummyWorkouts(count: Int) -> [HKWorkout] { var workouts: [HKWorkout] = [] let baseDate = Date() for i in 0..<count { // 按天生成不同日期的Workout let startDate = baseDate.addingTimeInterval(-TimeInterval(i) * 86400) // 随机时长(30分钟到2小时) let duration = TimeInterval.random(in: 1800...7200) // 随机卡路里和距离 let calories = Double.random(in: 150...800) let distance = Double.random(in: 5000...15000) let workout = HKWorkout( activityType: [.running, .cycling, .swimming].randomElement()!, start: startDate, end: startDate.addingTimeInterval(duration), workoutEvents: nil, totalEnergyBurned: HKQuantity(unit: .kilocalorie(), doubleValue: calories), totalDistance: HKQuantity(unit: .meter(), doubleValue: distance), metadata: [HKWorkoutMetadataKey.deviceName: "Test Device"] ) workouts.append(workout) } return workouts } // 调用示例:生成5条测试数据 let testWorkouts = generateDummyWorkouts(count: 5)
补充说明
- 这两种方式都不需要
HKHealthStore,直接在模拟器或Xcode Preview里就能运行,完全满足SwiftUI视图的测试需求。 - 如果需要模拟暂停、恢复这类复杂运动事件,只需要给
workoutEvents参数传入[HKWorkoutEvent]数组即可,基础UI测试用上面的简化写法就足够。
内容的提问来源于stack exchange,提问作者not link
相关产品推荐
相关产品推荐

