CLLocationManager.requestLocation сколько времени требуется для вызова своих делегатов - PullRequest
0 голосов
/ 09 мая 2019

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

После проверки рассматриваемого экрана это экран загрузки, который будет отображаться после успешного входа пользователя. Единственный код, который может вызвать застревание пользователя, - это CLLocationManager. Экран будет ждать, пока CLLocationManager вызовет didUpdateLocations или didFailWithError, а затем перейдет на панель мониторинга приложения.

Полагаю, CLLocationManage не вызывал ни одного из своих делегатов. Таким образом, пользователь застрял на экране «загрузки».

Как долго CLLocationManager.requestLocation вызывает свои функции делегата? Если запрос занимает слишком много времени, CCLocationManager вызывает didFailWithError?

Ниже сокращенная версия наших кодов:

override func viewDidLoad() {
    super.viewDidLoad()
    locationManager = CLLocationManager()
    locationManager.delegate = self
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.requestLocation()
}

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    // process the location then forward to dashboard screen
}

func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
    // forward to dashboard screen
}

Любая информация очень ценится! ТИА!

1 Ответ

0 голосов
/ 09 мая 2019

Если вы используете startUpdatingLocation(), обычно для получения первого обновления требуется около одной секунды.Первое обновление часто является старым (кэшированным) местоположением, но оно приходит быстро.

Использование requestLocation() может занять несколько секунд дольше, поскольку оно будет ждать, пока у него не будет единственного хорошего местоположения.

Этот метод возвращается немедленно.При его вызове диспетчер местоположений получает исправление местоположения (, которое может занять несколько секунд ) и вызывает делегат locationManager (_: didUpdateLocations :) с результатом.Исправление местоположения получается с уровнем точности, указанным в свойствах требуемой точности.Делегату сообщается только об одном исправлении местоположения, после чего службы определения местоположения останавливаются.

Ваша проблема в том, что вы не звонили requestWhenInUseAuthorization() в свой менеджер местоположений.Вы должны запросить разрешение на использование местоположения.Есть несколько других вещей, которые вам нужно сделать, а также вызвать эту функцию (добавить ключи в Info.plist приложения).

...