Широта и долгота неверны при первом запуске приложения ios

Я использую CLLocationManager для получения текущего местоположения пользователя. Мне нужно текущее местоположение пользователя, потому что я использую Open Weather Api для отображения данных о погоде, где бы ни находился пользователь. Моя проблема в том, что при первом открытии приложения значения широты и долготы равны 0, 0. Но если я снова запущу приложение, оно будет работать нормально. Поэтому только при первом запуске приложения используются неверные значения широты и долготы. Я делаю все свои настройки в viewDiDLoad, вот код...

locationManager = [[CLLocationManager alloc] init];
[locationManager requestAlwaysAuthorization];
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
    [self->locationManager requestWhenInUseAuthorization];

[locationManager startUpdatingLocation];

Я не знаю, что я делаю неправильно. Это как-то связано с получением широты и долготы в контроллере представления вместо делегата приложения?

Вот как я получаю значения местоположения:

locationManager.location.coordinate.latitude
locationManager.location.coordinate.longitude

person Harshil.Chokshi    schedule 15.04.2016    source источник
comment
Код не показывает, как вы получаете и обрабатываете значение местоположения. Предлагаю и вам поделиться этим. Кроме того, это симулятор или реальное устройство?   -  person Alex Pavlov    schedule 15.04.2016
comment
Хорошо, опубликуйте этот код сейчас. И я использую реальное устройство. Однако эта ошибка возникает как на симуляторе, так и на устройстве.   -  person Harshil.Chokshi    schedule 15.04.2016
comment
Вы говорите, что эти две строки следуют за предыдущими строками кода в одном и том же блоке/методе?   -  person Alex Pavlov    schedule 15.04.2016
comment
Нет, это то, что я передаю методу, который делает http-запрос к API открытой погоды.   -  person Harshil.Chokshi    schedule 15.04.2016


Ответы (2)


Это происходит потому, что при первом запуске приложения Диспетчер местоположений запрашивает у пользователя разрешение на доступ к текущему местоположению, а когда пользователь разрешает, получение текущего местоположения занимает мало времени, и вы получаете доступ к координатам до завершения. этого процесса.

Когда вы снова запускаете свое приложение, Диспетчер местоположения обнаруживает, что вы уже дали разрешение, и очень быстро дает вам текущую координату местоположения.

Итак, решение - вам нужно дождаться завершения обновления местоположения. Вы можете добавить некоторую задержку, используя dispatch ИЛИ можете использовать метод делегата менеджера местоположения didUpdateUserLocation ИЛИ, если ваш UIViewController не является исходным контроллером представления - в этом случае вы должны реализовать это процесс в AppDelegate, используйте свой код в didFinishLaunching, поэтому, когда вы откроете свой контроллер представления (какой бы поток навигации вы ни использовали), сведения о местоположении будут там, потому что в то же время диспетчер местоположения будет отслеживать ваше местоположение.

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

person Utkarsh Singh    schedule 15.04.2016
comment
Спасибо, это сработало для меня. Что я сделал, так это в NSUserDefaults, я проверил, первый ли это раз, когда пользователь запускает приложение, и если это так, я установил логическое значение в true. А затем в контроллере представления я проверил значение логического значения, и если оно было истинным, я использовал диспетчер для выполнения HTTP-запроса через 5 секунд. - person Harshil.Chokshi; 16.04.2016

Вы должны проверить horizontalAccuracy объекта CLLocation на наличие отрицательного значения и не использовать значение широты/долготы, если это так. Весьма вероятно, что когда вы видите, что значения широты/долготы равны 0/0, GPS не зафиксировал местоположение.

person adib    schedule 15.04.2016
comment
Горизонтальная точность 65. Что делать? Должен ли я добавить обработчик завершения и отображать погоду только после получения широты и долготы? - person Harshil.Chokshi; 15.04.2016
comment
Вы должны проверить детализацию службы погоды и сравнить ее с горизонтальной точностью GPS. - person adib; 11.02.2017