我如何使用 CYCHealthKitHandler 将我的活动定义为“室内骑行”
Posted
技术标签:
【中文标题】我如何使用 CYCHealthKitHandler 将我的活动定义为“室内骑行”【英文标题】:How I define my activity as "Indoor Cycling" using CYCHealthKitHandler 【发布时间】:2019-06-10 21:54:43 【问题描述】:问题是我正在从我的应用程序向 Apple Health 发送“骑行”活动,我希望它显示为“室内骑行”,但发送到 Apple Health 活动的所有活动都标记为“户外活动”,有有什么属性可以从我的代码中将它们定义为“室内自行车”活动?
我进行了研究,但只有一个活动可以定义自行车,正如您所见,我使用了下面的代码: FitnessWithActivityType:HKWorkoutActivityTypeCycling
这是我的活动在 Apple Activity 应用中的外观视图
- (void)saveWorkoutFromStartDate:(NSDate *)startDate endDate:(NSDate *)endDate duration:(double)duration miles:(double)miles kilocalories:(double)calories completion:(void (^)(BOOL success, NSError *error))completion
HKQuantity *milesQuantity = [HKQuantity quantityWithUnit:[HKUnit mileUnit] doubleValue:miles];
HKQuantity *caloriesQuantity = [HKQuantity quantityWithUnit:[HKUnit kilocalorieUnit] doubleValue:calories];
HKWorkout *workout = [HKWorkout workoutWithActivityType:HKWorkoutActivityTypeCycling startDate:startDate endDate:endDate duration:duration totalEnergyBurned:caloriesQuantity totalDistance:milesQuantity metadata:nil];
[self.healthStore saveObject:workout withCompletion:^(BOOL success, NSError *error)
if (success)
completion(success, nil);
else
DLog(@"%@", error);
completion(success, error);
];
【问题讨论】:
【参考方案1】:在实例化您的锻炼时,尝试将值为 YES 的元数据室内锻炼键添加到元数据字典中:
HKWorkout *workout = [HKWorkout workoutWithActivityType:HKWorkoutActivityTypeCycling startDate:startDate endDate:endDate duration:duration totalEnergyBurned:caloriesQuantity totalDistance:milesQuantity metadata:@HKMetadataKeyIndoorWorkout : @(YES)];
https://developer.apple.com/documentation/healthkit/hkmetadatakeyindoorworkout?language=objc
【讨论】:
这在 ios 13 中似乎仍然适用;即使设置了 HKWorkoutConfiguration.locationType = .indoor。元数据密钥 HKMetadataKeyIndoorWorkout 非常需要。【参考方案2】:这是在 HKWorkoutConfiguration
的 locationType
实例属性上设置的。
https://developer.apple.com/documentation/healthkit/hkworkoutconfiguration/1649491-locationtype?changes=_4&language=objc
【讨论】:
【参考方案3】:使用HKMetadataKeyIndoorWorkout
HKMetadataKeyIndoorWorkout
为我工作,例如:
var isIndoorWorkout = true
var metadata: Dictionary<String,Any>
var _metadata:Dictionary<String,Any> = [:]
_metadata[HKMetadataKeySyncIdentifier] = "Your unique workout Identifier goes here"
_metadata[HKMetadataKeySyncVersion] = yourDateCompletedAt.timeIntervalSince1970 // as an example for versioning
_metadata[HKMetadataKeyIndoorWorkout] = isIndoorWorkout // <-- HERE!
return _metadata
来源:HKMetadataKeyIndoorWorkout
【讨论】:
以上是关于我如何使用 CYCHealthKitHandler 将我的活动定义为“室内骑行”的主要内容,如果未能解决你的问题,请参考以下文章