Недавно я попытался внедрить 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")
//}
}
}
}