Координаты текущего местоположения пользователя iPhone отображаются как (0,0)

StackOverflow https://stackoverflow.com/questions/1449486

  •  11-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь получить текущую широту и долготу пользователей с помощью этого метода viewDidLoad.Результирующая карта правильно указывает текущее местоположение, однако NSLog последовательно показывает:

2009-09-19 16:45:29.765 Mapper[671:207] user latitude = 0.000000
2009-09-19 16:45:29.772 Mapper[671:207] user longitude = 0.000000

Кто-нибудь знает, чего мне здесь не хватает?Заранее спасибо за вашу помощь!

- (void)viewDidLoad {
    [super viewDidLoad];
    [mapView setMapType:MKMapTypeStandard];
    [mapView setZoomEnabled:YES];
    [mapView setScrollEnabled:YES];
    [mapView setShowsUserLocation:YES];

    CLLocation *userLoc = mapView.userLocation.location;
    CLLocationCoordinate2D userCoordinate = userLoc.coordinate;

    NSLog(@"user latitude = %f",userCoordinate.latitude);
    NSLog(@"user longitude = %f",userCoordinate.longitude);
}
Это было полезно?

Решение

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

Лучший способ решить эту проблему, если вам необходимо иметь местоположение при запуске, — это реализовать классический код обработчика основного местоположения и изначально получить местоположение из него.Вы можете перестать получать обновления оттуда, как только карта будет готова, и получать дальнейшие изменения оттуда (хотя, если вам нужны постоянные обновления, вам лучше просто использовать стандартные обновления основного местоположения.Если подумать, когда на карте включено «показывать местоположение пользователя», дальнейшее использование Core Location вашим приложением по существу бесплатно, поскольку GPS все равно будет включен все время.

Другие советы

Если вы попытаетесь получить координаты пользователя в методе viewDidLoad(), он всегда будет давать результат 0,0, поскольку он еще не инициализирован.

Вам следует взглянуть на пример кода «Где я» на сайте Apple.Там объясняется, что вам нужно.Вам нужно использовать CLLationManager сорт.Вам также понадобится метод

*-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation*

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

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

Из документа о Местоположение, если точность по горизонтали или вертикали отрицательна, это означает, что он не может найти значение.Я подозреваю, что именно это здесь и происходит.Имейте в виду, что если вы посмотрите всего один раз, это может дать вам приблизительное последнее известное местоположение, прежде чем вы когда-либо улучшите результат точности.

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

Вы должны получить координаты из CoreLocation вместо MapKit.MapView будет отображать местоположение пользователя после того, как он фактически получил текущее местоположение.Прежде чем местоположение будет определено, широта и долгота устанавливаются на 0.3

Вам следует создать экземпляр CLLocationManager, установить делегата.Вы будете уведомлены, когда местоположение будет определено.

Как Кендалл сказал, что у MKMapView нет местоположения пользователя до тех пор, пока он не завершит загрузку, и метод viewDidLoad обычно слишком рано запрашивать его.Более простой способ, чем использование CoreLocation, — реализовать метод MKMapViewDelegate.-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation.Он сообщит вам местоположение пользователя, как только оно будет обнаружено, без необходимости иметь дело с CLLocationManager.

В этом ответе объясняется, как настроить вид карты с указанием местоположения пользователя:

Как инициализировать MKMapView с заданным местоположением пользователя?

Попробуйте это в

CLLocation *userLoc = mapView.userLocation.location;
CLLocationCoordinate2D userCoordinate = userLoc.coordinate;

NSLog(@"user latitude = %f",userCoordinate.latitude);
NSLog(@"user longitude = %f",userCoordinate.longitude);

Просмотр сделалПоявление:или вызовите селектор после задержки

Добавьте это в свой раздел viewDidLoad.

mapView.showsUserLocation = YES;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top