Кажется, CoreMotion не предоставляет доступ к шагомеру - PullRequest
0 голосов
/ 11 октября 2018

Недавно я попытался внедрить CoreMotion в свое приложение и отобразить количество шагов, которые сделал пользователь.Код, который я предоставил, работает без ошибок, однако, когда я запускаю следующую строку кода print(CMPedometer.isStepCountingAvailable в методе viewDidLoad, журнал отладки печатает false, а stepCountLabel читает «Недоступно» (как следует, еслишагомер недоступен).Я добавил Privacy - Motion Usage Description в свой info.plist, чтобы попросить у пользователя разрешения на доступ к данным CoreMotion, но он по-прежнему не дает мне доступа к данным.Как я могу изменить CMPedometer.isStepCountingAvailable на печать true и получить доступ к этим данным?

Код регулятора шагомера:

import UIKit
import CoreMotion

class PedometerController: UIViewController {

@IBOutlet weak var startButton: UIButton!
@IBOutlet weak var stepCountLabel: UILabel!

private let pedometer = CMPedometer()
private let activityManager = CMMotionActivityManager()
private var shouldStartUpdating: Bool = false
private var startDate: Date? = nil


override func viewDidLoad() {
    super.viewDidLoad()
    startButton.addTarget(self, action: #selector(didTapStartButton), for: .touchUpInside)
    print(CMPedometer.isStepCountingAvailable())
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    guard let startDate = startDate else { return }
    updateStepsCountLabelUsing(startDate: startDate)
    print(startDate)
}

@objc private func didTapStartButton() {
    shouldStartUpdating = !shouldStartUpdating
    shouldStartUpdating ? (onStart()) : (onStop())
   }
}

 extension PedometerController {
private func onStart() {
    startButton.setTitle("Stop", for: .normal)
    startDate = Date()
    checkAuthorizationStatus()
    startUpdating()
}

private func onStop() {
    startButton.setTitle("Start", for: .normal)
    startDate = nil
    stopUpdating()
}

private func startUpdating() {

    if CMPedometer.isStepCountingAvailable() {
        startCountingSteps()
    } else {
        stepCountLabel.text = "Not available"
    }
}

private func checkAuthorizationStatus() {
    switch CMMotionActivityManager.authorizationStatus() {
    case CMAuthorizationStatus.denied:
        onStop()
        //activityTypeLabel.text = "Not available"
        stepCountLabel.text = "Not available"
    default:break
    }
}

private func stopUpdating() {
    activityManager.stopActivityUpdates()
    pedometer.stopUpdates()
    pedometer.stopEventUpdates()
}

private func on(error: Error) {
    //handle error
}

private func updateStepsCountLabelUsing(startDate: Date) {
    pedometer.queryPedometerData(from: startDate, to: Date()) {
        [weak self] pedometerData, error in
        if let error = error {
            self?.on(error: error)
        } else if let pedometerData = pedometerData {
            DispatchQueue.main.async {
                self?.stepCountLabel.text = String(describing: pedometerData.numberOfSteps)
            }
        }
    }
}

private func startCountingSteps() {
    pedometer.startUpdates(from: Date()) {
        [weak self] pedometerData, error in
        guard let pedometerData = pedometerData, error == nil else { return }

        //DispatchQueue.main.async {
            self?.stepCountLabel.text = pedometerData.numberOfSteps.stringValue
            print(pedometerData.startDate)
            print("Boss")
        //}
    }
}


}
...