Менеджер CLLocation продолжает получать одинаковую широту и долготу при нажатии кнопки - PullRequest
1 голос
/ 27 апреля 2011

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

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

в моем приложении мне нужно получитьтекущее местоположение пользователя, когда пользователь нажимает на кнопку в приложении ... но проблема заключается в том, что, если нажать на кнопку, она не обновляется до текущего местоположения и не получает предыдущее местоположение.Но когда я сбрасываю предупреждения о местоположении в приложении 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];
}

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

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

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

Ответы [ 2 ]

1 голос
/ 27 апреля 2011

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;
}
0 голосов
/ 23 мая 2011

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

[_ sharedGlobals.locationManager setDesiredAccuracy: kCLLocationAccuracyBest];

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

[_ sharedGlobals.locationManager setDesiredAccuracy: kCLLocationAccuracyBestforNavigation];

...