Ошибка получения данных из CMPedometer: «Ошибка при ответе на сообщение (соединение недействительно)» - PullRequest
0 голосов
/ 16 июня 2019

Я пытаюсь получить количество шагов, используя CMPedometer в CoreMotion, но я получаю следующую ошибку в журнале, а не количество шагов: Ошибка при ответе на сообщение (Соединение недействительно). Пример ниже работает на устройстве (не на симуляторе).

Код (внутри viewDidLoad в ViewController.swift):

let pedometer = CMPedometer()
if CMPedometer.isStepCountingAvailable() {
    print("Step counting is available...")
    let calendar = Calendar.current
    let fromDate = calendar.startOfDay(for: Date())
    let toDate = Date()
    print("From date = \(fromDate)")
    print("To date = \(toDate)")
    pedometer.queryPedometerData(from: fromDate, to: toDate) { (data, error) in
    print("Handler (data):")
    print(data!)
}

Войти:

Step counting is available...
From date = 2019-06-15 22:00:00 +0000
To date = 2019-06-15 22:48:35 +0000
2019-06-16 00:48:40.827268+0200 StepTest2[3857:1087379] [Generic_deprecated] Error on message reply (Connection invalid)

1 Ответ

0 голосов
/ 16 июня 2019

Похоже, что let pedometer = CMPedometer() должен быть нелокальным, например объявлен в классе за пределами of viewDidLoad. Почти весь код:

@IBOutlet weak var stepLabel: UILabel!
let pedometer = CMPedometer()
override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.

    if CMPedometer.isStepCountingAvailable() {
        print("Step counting is available...")
        let calendar = Calendar.current
        var toDate = Date()
        var fromDate = calendar.startOfDay(for: toDate)
        fromDate = calendar.date(byAdding: .hour, value: -24, to: fromDate)!
        toDate = calendar.date(byAdding: .hour, value: 2, to: toDate)!
        print("From date = \(fromDate)")
        print("To date = \(toDate)")

        pedometer.queryPedometerData(from: fromDate, to: toDate) { (data, error) in
            print("Handler (data):")
            print(data!)
            guard let activityData = data, error == nil else {
                print("There was an error getting the data: \(error!)")
                return
            }
            DispatchQueue.main.async {
                self.stepLabel.text = "Steps and distance: \(activityData.numberOfSteps) \(activityData.distance ?? -1)"
            }
        }
    }
}
...