Работает нормально, когда доступ к Healthkit был ранее разрешен на устройстве, но в противном случае происходит сбой - PullRequest
0 голосов
/ 21 января 2019
override func viewDidLoad() {
    super.viewDidLoad()
    ref = Database.database().reference()
    let healthKitTypes: Set = [
        // access step count
        HKObjectType.quantityType(forIdentifier: HKQuantityTypeIdentifier.stepCount)!
    ]
    healthStore.requestAuthorization(toShare: healthKitTypes, read: healthKitTypes) { (_, _) in
        print("authorized???")
    }
    healthStore.requestAuthorization(toShare: healthKitTypes, read: healthKitTypes) { (bool, error) in
        if let e = error {
            print("oops something went wrong during authorization \(e.localizedDescription)")
        } else {
            print("User has completed the authorization flow")
        }
    }


    getTodaysSteps { (result) in
        print("\(result)")
        self.steps = result

        DispatchQueue.main.async {
            if result == 0 {
                self.StepDisplay.text = " You haven't walked"
            } else {
                self.StepDisplay.text = "\(result)"
            }

        }
    }


    getStepHistory()



}


func getStepHistory() {
    let calendar = Calendar.current
    var interval = DateComponents()
    interval.day = 1

    // Set the anchor date to Monday at 3:00 a.m.
    var anchorComponents = calendar.dateComponents([.day, .month, .year, .weekday], from: Date())


    let offset = (7 + (anchorComponents.weekday ?? 0) - 2) % 7
    anchorComponents.day = (anchorComponents.day ?? 0) - offset
    anchorComponents.hour = 0
    anchorComponents.minute = 1

    guard let anchorDate = calendar.date(from:anchorComponents) else {
        fatalError("*** unable to create a valid date from the given components ***")
    }

    guard let quantityType = HKObjectType.quantityType(forIdentifier: HKQuantityTypeIdentifier.stepCount) else {
        fatalError("*** Unable to create a step count type ***")
    }

Этот код работает нормально, если на устройстве уже дана авторизация. Однако, если он не был авторизован ранее, он не будет работать, если getStepHistory () не закомментирован в viewDidLoad. Я попытался запросить дополнительную авторизацию из функции getStepHistory (), но это не решило проблему

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Запрос разрешения пользователя

Для запроса авторизации мы вызываем

запрос Авторизации (toShare: , readTypes: , завершение :) на HKHealthStore экземпляр. Этот метод принимает три параметра:

  • необязательный набор объектов HKSampleType
  • необязательный набор объектов HKObjectType
  • обработчик завершения с двумя параметрами: логическое значение, указывающее результат запроса авторизации (успешный или неудачный) и необязательная ошибка

Важно понимать, что логическое значение обработчика завершения не указывает, предоставил ли пользователь доступ к запрошенным типам данных о работоспособности или отказал ему. Он только сообщает приложению, ответил ли пользователь на запрос авторизации приложения. Если пользователь отклонил форму, отменив запрос на авторизацию, логическое значение обработчика завершения устанавливается равным false.

На ваш взгляд загружен:

healthStore.requestAuthorization(toShare: healthKitTypes, read: healthKitTypes) { (success, error) in
    if let err = error {
        print("Error \(err.localizedDescription)")
    } else if success {
        // Get the Step Count....
        getStepHistory()
    } else {
        print("No access to healthkit data")
    }
}

По желанию Вы можете попробовать эту функцию, чтобы получить количество шагов:

    let healthStore = HKHealthStore()

    func getTodaysSteps(completion: @escaping (Double) -> Void) {
        let stepsQuantityType = HKQuantityType.quantityType(forIdentifier: .stepCount)!

        let now = Date()
        let startOfDay = Calendar.current.startOfDay(for: now)
        let predicate = HKQuery.predicateForSamples(withStart: startOfDay, end: now, options: .strictStartDate)

        let query = HKStatisticsQuery(quantityType: stepsQuantityType, quantitySamplePredicate: predicate, options: .cumulativeSum) { _, result, _ in
            guard let result = result, let sum = result.sumQuantity() else {
                completion(0.0)
                return
            }
            completion(sum.doubleValue(for: HKUnit.count()))
        }

        healthStore.execute(query)
    }
0 голосов
/ 21 января 2019

Вам необходимо вызвать getStepHistory внутри блока завершения на requestAuthorization, если он был авторизован.

healthStore.requestAuthorization(toShare: healthKitTypes, read: healthKitTypes) { (success, error) in
    if let e = error {
        print("oops something went wrong during authorization \(e.localizedDescription)")
    } else if success {
        print("User has granted access")
        getStepHistory()
    } else {
        print("User has completed the authorization flow but there is no access")
    }
}
...