Как получить доступ и прочитать ходячие события из приложения Здоровье? - PullRequest
0 голосов
/ 13 февраля 2019

Когда я запускаю приложение 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)
}
...