Диспетчер CLLocation продолжает получать ту же широту и долготу при нажатии кнопки?

Это мой первый вопрос на этом сайте.

У меня серьезная проблема.... Я объясню это с самого начала...

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

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

Сначала я импортирую в приложение...

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

так что я сделал в файле globle.m и .h...

CLLocationManager* locationManager;

@synthesize locationManager


+ (Globals*)sharedGlobals {
    @synchronized(self) {
        if(_sharedGlobals == nil) {
            _sharedGlobals = [[super allocWithZone:NULL] init];


   _sharedGlobals.locationManager = [[CLLocationManager alloc]init];
   [_sharedGlobals.locationManager   setDesiredAccuracy:kCLLocationAccuracyBest];

        }
    }

    return _sharedGlobals;
}

Затем в моем другом контроллере представления я помещаю CLLocationManagerDelegate и в файл .m

-(IBAction) didTapSearchbtn{

    if (![CLLocationManager locationServicesEnabled]) {


    }else {

        [[Globals sharedGlobals].geoLocations removeAllObjects];
        search.text = nil;
        [Globals sharedGlobals].fromTextField = NO;

        [[Globals sharedGlobals].locationManager setDelegate:self];
        [[Globals sharedGlobals].locationManager startUpdatingLocation];


    }


}


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

    if (newLocation.horizontalAccuracy < 0) return; 

    [[Globals sharedGlobals].locationManager setDelegate:nil];
    [[Globals sharedGlobals].locationManager stopUpdatingLocation];

    [[Globals sharedGlobals].geoLocations setObject:[[NSString alloc] initWithFormat:@"%f", newLocation.coordinate.latitude] forKey:@"geolat"];
    [[Globals sharedGlobals].geoLocations setObject:[[NSString alloc] initWithFormat:@"%f", newLocation.coordinate.longitude] forKey:@"geolong"];

    [self retriveDataFromInternet];

    [[Globals sharedGlobals].locationManager release];

}


- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
    //GPS error

    [[Globals sharedGlobals].locationManager setDelegate:nil];
    [[Globals sharedGlobals].locationManager stopUpdatingLocation];


    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"YumTable!", nil) message:NSLocalizedString(@"Enable Your GPS settings to get your current location", nil) delegate:nil cancelButtonTitle:NSLocalizedString(@"Ok", nil) otherButtonTitles:nil];
    [alert show];
    [alert release];

    [[Globals sharedGlobals].locationManager release];
}

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

Может ли кто-нибудь сказать, что не так в этом коде, и может ли кто-нибудь мне помочь....

А также очень-очень сожалею о моем плохом английском... :)


person Sameera Chathuranga    schedule 27.04.2011    source источник


Ответы (2)


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

Я бы посоветовал вам посмотреть пример кода, предоставленный Apple, https://developer.apple.com/library/ios/#samplecode/LocateMe/Introduction/Intro.html#//apple_ref/doc/uid/DTS40007801

Этот код скопирован из примера:

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
    // test the age of the location measurement to determine if the measurement is cached
    // in most cases you will not want to rely on cached measurements
    NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow];
    if (locationAge > 5.0) return;
}
person Johan    schedule 27.04.2011
comment
Можете ли вы объяснить это немного больше ... о том, как использовать эту временную метку? ... это мое первое приложение, связанное с отслеживанием местоположения ... спасибо - person Sameera Chathuranga; 28.04.2011

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

[_sharedGlobals.locationManager setDesiredAccuracy:kCLLocationAccuracyBest];

вместо этого я использовал

[_sharedGlobals.locationManager setDesiredAccuracy:kCLLocationAccuracyBestforNavigation];

person Sameera Chathuranga    schedule 23.05.2011