Когда я запускаю приложение Health, я могу видеть все пройденное мной расстояние или пробег за определенный период времени, а также увидеть детали с отдельными событиями.Но когда я пытаюсь получить все ходячие тренировки в своем приложении с помощью HealthKit, образцы вообще не отображаются.
Означает ли это, что я не могу получить доступ к тренировкам, которые были сохранены приложением Apple Health, или онине тренировки?
Вот мой код:
func fetchData() {
guard HKHealthStore.isHealthDataAvailable() else {
throwError(HealthTrackerError.notAvailableOnDevice)
return
}
let type = HKWorkoutType.workoutType()
let completion = { [weak self] (isAuthorized: Bool, error: Error?) in
DispatchQueue.main.async { [weak self] in
isAuthorized ? self?.fetchData(type) : self?.throwError(error)
}
}
switch HKHealthStore().authorizationStatus(for: type) {
case .notDetermined:
HKHealthStore().requestAuthorization(toShare: [type],
read: [type],
completion: completion)
case .sharingAuthorized:
fetchData(type)
case .sharingDenied:
throwError(HealthTrackerError.accessDenied)
}
}
private func fetchData(_ workout: HKWorkoutType) {
let predicate = HKQuery.predicateForWorkouts(with: .walking)
let query = HKSampleQuery(sampleType: workout, predicate: predicate, limit: 0, sortDescriptors: nil) { [weak self] (query, samples, error) in
guard let workouts = samples as? [HKWorkout] else {
self?.throwError(error)
return
}
// No workouts were found
self?.values = workouts
.map { $0.totalEnergyBurned?.doubleValue(for: HKUnit.kilocalorie()) }
.filter { $0 != nil }
.map { $0! }
}
HKHealthStore().execute(query)
}
Благодаря MwcsMac за ссылку, вот обновленный код, который работает для меня.
func fetchData() {
guard HKHealthStore.isHealthDataAvailable() else {
throwError(HealthTrackerError.notAvailableOnDevice)
return
}
guard let type = HKQuantityType.quantityType(forIdentifier: .distanceWalkingRunning) else {
throwError(HealthTrackerError.dataTypeNotAvailable)
return
}
let completion = { [weak self] (isAuthorized: Bool, error: Error?) in
DispatchQueue.main.async { [weak self] in
isAuthorized ? self?.fetchData(type) : self?.throwError(error)
}
}
switch HKHealthStore().authorizationStatus(for: type) {
case .notDetermined:
HKHealthStore().requestAuthorization(toShare: [type],
read: [type],
completion: completion)
case .sharingAuthorized:
fetchData(type)
case .sharingDenied:
throwError(HealthTrackerError.accessDenied)
}
}
private func fetchData(_ quantityType: HKQuantityType) {
let predicate = HKQuery.predicateForSamples(withStart: startDate,
end: currentDate,
options: [])
let query = HKSampleQuery(sampleType: quantityType, predicate: predicate, limit: HKObjectQueryNoLimit, sortDescriptors: nil) { [weak self] (query, samples, error) in
guard let samples = samples as? [HKQuantitySample] else {
self?.throwError(error)
return
}
self?.values = samples.map { $0.quantity.doubleValue(for: HKUnit.meter()) }
}
HKHealthStore().execute(query)
}