Swift - Невозможно получить записи CMSensorDataList - PullRequest
1 голос
/ 12 марта 2019

Я создаю приложение Watch, которое будет записывать ускорение пользователя. Для этого я использовал CMSensorRecorder из CoreMotion Framework.

В настоящий момент программа работает так, что пользователь нажимает кнопку на часах, которая запускает ускорение для записи в течение 30 секунд. После этого происходит 6-минутная задержка (см. Ответ здесь: watchOS2 - CMSensorRecorder , для чтения данных требуется задержка), а данные ускорения и метки времени выводятся на консоль.

Прямо сейчас я получаю "Недопустимый ответ" и "Произошла ошибка" при запуске приложения. Я добавил описание использования движения в файл info.plist.

Я довольно новичок в Swift и разработке приложений, и я боюсь, что что-то не так с тем, как я пытаюсь получить доступ к данным. Я приложил журналы консоли и код ниже.

Кто-нибудь может дать некоторое представление о сообщениях и как решить эту проблему? Я искал вокруг, но не нашел ни одного случая этой проблемы раньше. Приветствия.

    func recordAcceleration(){
        if CMSensorRecorder.isAccelerometerRecordingAvailable(){
            print("recorder started")
            recorder.recordAccelerometer(forDuration: 30)   //forDuration controls how many seconds data is recorded for.
            print("recording done")
        }
    }

    func getData(){
        if let list = recorder.accelerometerData(from: Date(timeIntervalSinceNow: -400), to: Date()){
            print("listing data")

            for data in list{
                if let accData = data as? CMRecordedAccelerometerData{
                    let accX = accData.acceleration.x
                    let timestamp = accData.startDate
                    //Do something here.
                    print(accX)
                    print(timestamp)
                }
            }
        }

    }


    //Send data to iphone after time period.
    func sendData(dataBlock:CMSensorDataList){
        WCSession.default.transferUserInfo(["Data" : dataBlock])
    }



    //UI Elements
    @IBAction func recordButtonPressed() {
        print("button pressed")
        recordAcceleration()

        //A delay is needed to read the data properly.
        print("delaying 6 mins")
        perform(#selector(callback), with: nil, afterDelay: 6*60)

    }

    @objc func callback(){
        getData()
    }

    extension CMSensorDataList: Sequence {
    public func makeIterator() -> NSFastEnumerationIterator {
        return NSFastEnumerationIterator(self)
    }

Console output:

button pressed

recorder started

2019-03-12 12:12:12.568962+1100 app_name WatchKit Extension[233:5614] [Motion] Warning - invoking recordDataType:forDuration: on main may lead to deadlock.

2019-03-12 12:12:13.102712+1100 app_name WatchKit Extension[233:5614] [SensorRecorder] Response invalid.

recording done

delaying 6 mins

2019-03-12 12:18:13.115955+1100 app_name WatchKit Extension[233:5614] [Motion] Warning - invoking sensorDataFromDate:toDate:forType: on main may lead to deadlock.

2019-03-12 12:18:13.162476+1100 app_name WatchKit Extension[233:5753] [SensorRecorder] Error occurred while trying to retrieve accelerometer records!

1 Ответ

0 голосов
/ 16 марта 2019

Я запустил ваш код и не получил «Неверный ответ» или «Произошла ошибка». Я получил предупреждения главного потока. Поэтому я переключился на фоновый поток, и он отлично работает.

Кроме того, я не думаю, что вам нужно ждать шесть минут. Я изменил это на одну минуту.

Надеюсь, это поможет.

let recorder = CMSensorRecorder()
@IBAction func recordAcceleration() {
    if CMSensorRecorder.isAccelerometerRecordingAvailable() {
        print("recorder started")
        DispatchQueue.global(qos: .background).async {
            self.recorder.recordAccelerometer(forDuration: 30)
        }
        perform(#selector(callback), with: nil, afterDelay: 1 * 60)
    }
}
@objc func callback(){
    DispatchQueue.global(qos: .background).async { self.getData() }
}
func getData(){
    print("getData started")
    if let list = recorder.accelerometerData(from: Date(timeIntervalSinceNow: -60), to: Date()) {
        print("listing data")
        for data in list{
            if let accData = data as? CMRecordedAccelerometerData{
                let accX = accData.acceleration.x
                let timestamp = accData.startDate
                //Do something here.
                print(accX)
                print(timestamp)
            }
        }
    }
}
...