4

当从 Health 应用程序中删除与您关联的其他样本的锻炼时,HKHealthStore.healthStore.add(_:, to:, completion:)系统会提示您是否只想删除锻炼或链接数据,如下面的屏幕截图所示:

在此处输入图像描述

我正在尝试在我正在构建的应用程序中重新创建相同的功能,我想知道是否有一个简单的 API 可以以简单的方式执行此操作。

仅删除锻炼可以通过简单HKHealthStore.delete(_:,completion:)的方式完成,但我找不到将所有链接数据一起加载(或删除)的方法。HKHealthStore.deleteObjects(of:, predicate:, withCompletion:)通过传递创建的谓词似乎很有希望,HKQuery.predicateForObjects(from:)但似乎您无法指定与任何类型的对象匹配的类型。

是否有一种我没有看到的简单方法来执行此操作,或者我必须手动删除我知道我已链接到锻炼的每个对象类型?

4

1 回答 1

2

如果您想删除一项锻炼,并且所有示例都链接到该锻炼。

您首先需要使用 HKSampleQuery 获取要删除的锻炼。一旦你拿到它。您没有选择保存可以链接到锻炼的所有样本类型。您可以使用一个函数,例如:

private func samplesTypeLinkedToWorkout() -> [HKObjectType] {
        return [
            HKObjectType.quantityType(forIdentifier: HKQuantityTypeIdentifier.heartRate)!,
            HKQuantityType.quantityType(forIdentifier: HKQuantityTypeIdentifier.distanceWalkingRunning)!,
            HKQuantityType.quantityType(forIdentifier: HKQuantityTypeIdentifier.distanceCycling)!,
            HKSeriesType.workoutRoute()
        ]
    }

使用 HKQuery.predicateForObjects(from: HKWorkout) 找到所有指向锻炼的 HKSamples 链接并删除它们:

let workoutObjectsPredicate = HKQuery.predicateForObjects(from: workoutInHealthKit)
samplesTypeLinkedToWorkout().forEach {
    self.healthKitStore.deleteObjects(of: $0, predicate: workoutObjectsPredicate) { (_, _, _) in }
}

删除它们后,您只需使用以下命令删除锻炼:

healthKitStore.delete(workoutInHealthKit) { (deleteSucceed, _) in
   completion(deleteSucceed)
}
于 2020-10-28T12:38:52.297 回答