CMSensorRecorder не авторизован, но мне никогда не предлагается давать авторизацию? - PullRequest
2 голосов
/ 08 апреля 2019

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

Моя проблема: я использовал объект CMSensorRecorder для записи данных.Это работало некоторое время, но CMSensorRecorder.authorizationStatus() теперь «не авторизовано».

У меня было NSMotionUsageDescription в info.plist файлах приложений для часов и телефона с самого начала.Я удалил и снова добавил их, но без удачи

Я помню, как приложение отображало подсказку, чтобы разрешить отслеживание движения, но не может воссоздать возможность отображать подсказку.Буду очень признателен за любые советы о том, как снова включить CMSensorRecorder.Приветствия.

Мой код инициализации CMSensorRecorder:

if CMSensorRecorder.isAccelerometerRecordingAvailable(){
            if CMSensorRecorder.authorizationStatus() == .authorized {
                print("\(Date()): recorder started")
                DispatchQueue.global(qos: .background).async {
                    DispatchQueue.global(qos: .background).sync{
                        self.dateStart = Date()
                        self.recorder.recordAccelerometer(forDuration: self.duration)   
                    }
                }
            }
            else {
                print("\(CMSensorRecorder.authorizationStatus())")
                self.xAccLabel.setText("not authorised")
            }
        }
        else {
            print ("Recording not available")
            self.xAccLabel.setText("Not available")
        }

1 Ответ

0 голосов
/ 08 апреля 2019

Найдено ЭТОГО потока для этого и есть один ответ для этого, который говорит:

Я обнаружил, что CMSensorRecorder.isAuthorizedForRecording() возвращает true только после авторизации вашего приложенияв Privacy/Motion & Fitness (на iPhone).Затем, чтобы приложение было авторизовано для Motion & Fitenss, мне пришлось получить доступ к одной из основных функций движения (например, startActivityUpdatesToQueue или даже recordAccelerometerForDuration).После этого вам просто нужно подтвердить на iPhone, и теперь CMSensorRecorder.isAuthorizedForRecording() возвращает true.

Тем не менее, я не могу получить какие-либо данные от CMSensorRecroding.В моем случае функция accelerometerDataFromDate не возвращает никаких данных - возвращаемое значение всегда равно nil.Поскольку в другом месте сказано, что для того, чтобы данные стали доступны, может потребоваться до 3 минут, я выполняю следующий сценарий:

  1. Я начинаю сеанс перекодирования с recordAccelerometerForDuration(30).Здесь я записываю текущую дату: recordingStartDate = NSDate().

  2. Я жду более 3min30s (при сохранении приложения на часах в активном состоянии) и по истечении этого времени я звоню:

    accelerometerDataFromDate(NSDate(timeInterval: 10, sinceDate: recordingStartDate), toDate: NSDate(timeInterval: 20, sinceDate: recordingStartDate)

    Как вы можете видеть, я делаю 10-секундное окно в запрошенном кадре 30-секундной записи.

  3. Я получаю nil.

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

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

Может быть, все станет лучшепосле 9 сентября.

Так что для authorization я пробовал startActivityUpdates, как показано ниже

self.activityManager.startActivityUpdates(to: OperationQueue.main, withHandler: {(data: CMMotionActivity!) -> Void in

})

и вам нужно объявить let activityManager = CMMotionActivityManager()

Икак только пользователь разрешит это if CMSensorRecorder.authorizationStatus() == .authorized { будет true.

...