GPS-навигация iPhone не будет выходить

У меня есть приложение для iPhone с кнопкой навигации на одном из моих видов. Когда пользователь нажимает эту кнопку, он использует телефоны CLLocationManager, чтобы открыть приложение iPhone для iPhone. Затем он получает текущее местоположение пользователя и показывает навигацию к заранее установленному заданному значению.

Здесь все в порядке, но когда я выхожу из системы GPS-навигации (нажав кнопку "Домой") и возвращаюсь к приложению, приложение отображает вид с кнопкой "Навигация" на нем в течение секунды или 2, а затем запускает Снова навигация по GPS без нажатия кнопок. Я также не могу нажимать какие-либо кнопки, например кнопку "Назад" в верхней панели навигации.

Может кто-нибудь сказать мне, почему это происходит и как я могу это остановить? Вот мой код для GPS-навигации.

В моем viewDidLoad я создал кнопку навигации программно

UIButton *mapButton = [[UIButton alloc] init];
mapButton = [UIButton buttonWithType:UIButtonTypeCustom];
mapButton.tag = 1;
mapButton.frame = CGRectMake(20, 430, 280.f, 40.f);
UIImage *mapButtonImage = [UIImage imageNamed:@"gettingHereMapButton.png"];
[mapButton setBackgroundImage:mapButtonImage forState:UIControlStateNormal];
[self.view addSubview:mapButton];
[mapButton addTarget:self action:@selector(mapButtonClicked) forControlEvents:UIControlEventTouchUpInside];

Который затем идет к

- (void) mapButtonClicked
{
    self.locationManager = [[CLLocationManager alloc] init];
    locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    locationManager.delegate = self;
    [locationManager startUpdatingLocation];
}

- (void) locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
    UIAlertView *alert =
    [[UIAlertView alloc] initWithTitle:@"Alert"
                           message:@"An error has occured. Please try again later."
                          delegate:self
                 cancelButtonTitle:@"Cancel"
                 otherButtonTitles:@"OK",
                 nil]; 
    [alert show];
}

- (void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    CLLocation *newLocation = [locations lastObject];
    CLLocation *oldLocation;

    NSString *destAddress = @"52.269444, -9.708674";
    NSString *url = [NSString stringWithFormat: @"http://maps.apple.com/maps?saddr=%f%f&daddr=%@",
                 newLocation.coordinate.latitude,
                 newLocation.coordinate.longitude,
                 [destAddress stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];
}

Что мне нужно добавить к этому виду, чтобы это не происходило?

2 ответа

Решение

Проблема в том, что когда вы делаете [locationManager startUpdatingLocation];, locationManager вызывает didUpdateLocations многократно.

Чтобы исправить это, в

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

Добавьте эту строку:

[manager stopUpdatingLocation];

чуть выше:

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];

Даже если ты позвонишь stopUpdatingLocation Менеджер локаций не остановится didupdateLocations немедленно. Он будет вызываться несколько раз, может быть 2, 3, 4 или более раз.

Лучше вы можете взять один BOOL и проверьте, как только ваше местоположение было обновлено, установите его YES и позвонить stopUpdatingLocaiton, Так что пока didUpdateLocations позвоните еще раз проверьте с вашим BOOL, И решить, нужно ли выполнять операцию или нет.

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

Перед использованием CoreLocation, пожалуйста, прочитайте следующие ссылки:

http://www.perspecdev.com/blog/2012/02/22/using-corelocation-on-ios-to-track-a-users-distance-and-speed/

http://www.peachpit.com/articles/article.aspx?p=1830485&seqNum=2

Другие вопросы по тегам