CLLocationManager всегда возвращает одно и то же местоположение

Я пытаюсь настроить новые CLLocation и CLRegion, но местоположение всегда возвращается с одними и теми же координатами, независимо от того, где я на самом деле нахожусь. Мой основной UIViewController соответствует протоколу CLLocationManagerDelegate, как и пользовательский класс. Когда пользовательский класс инициализируется, у меня есть таймер, установленный на 0,25 секунды позже, с этим кодом:

mainLocationManager = [[CLLocationManager alloc] init];
[mainLocationManager startUpdatingLocation];
location = [mainLocationManager location];
if (![location.timestamp isEqualToDate:[NSDate dateWithTimeIntervalSinceNow:0]]) { //filters cached data by updating location if cached data not recent enough
    location = [mainLocationManager location];
}

//Set up region
region = [[CLRegion alloc] initCircularRegionWithCenter:location.coordinate
                                                     radius:500
                                                 identifier:[NSString stringWithFormat:@"region:%@", locationName]];
NSLog(@"%@       %@", location, region);

Код работает, за исключением того, что координата всегда имеет одно и то же значение. Я не уверен, как это изменить. Любая помощь приветствуется, спасибо!


person jfherrm    schedule 29.05.2014    source источник
comment
Какие координаты? Это ваше фактическое местонахождение? Вы запускаете это на устройстве или симуляторе?   -  person jrturton    schedule 29.05.2014
comment
вы пытаетесь получить его синхронно - неправильно. API асинхронный. делай что сказал Доминик или Дункейн   -  person Daij-Djan    schedule 29.05.2014


Ответы (3)


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

Получить местоположение обновления этим методом

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations

{
location_updated = [locations lastObject];    
NSLog(@"updated coordinate are %@",location_updated);

}

Также протестируйте его на устройстве.

person Gajendra Rawat    schedule 29.05.2014

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

Вы должны установить себя в качестве делегата диспетчера местоположения, вызвать startUpdatingLocation, а затем дождаться, пока он вызовет ваш метод locationManager:didUpdateToLocation:fromLocation:. Фактически, вам нужно проверять обновления местоположения, которые вы получаете, и отклонять старую, устаревшую информацию о местоположении или обновления местоположения, которые являются слишком неточными (когда вы впервые включаете обновления местоположения, первое обновление, которое вы получаете, относится к последнему времени активности GPS, и иногда устаревает на часы или дни.Тогда следующие обновления довольно неточны, пока GPS не успокоится и не начнет давать хорошие показания.)

person Duncan C    schedule 29.05.2014

Чтобы это работало, вам нужно реализовать делегат:

locationManager:didUpdateLocations:

см. также здесь.

Для правильного использования:

Как получить текущее местоположение с помощью CLLocationManager в iOS

person dominik    schedule 29.05.2014