CLGeocoder reverseGeocodeLocation возвращает 'kCLErrorDomain error 9' - PullRequest
12 голосов
/ 02 марта 2012

Я разрабатываю приложение для iOS с функциями обратного геокодирования в соответствии с этой статьей: Учебное пособие по геокодированию

Но когда я тестирую подобное на симуляторе, я получаю 'kCLErrorDomain error 9'.Я много искал и есть только ошибка 0 или 1, а не 9.

Вот мой код в viewDidLoad:

self.locationManager = [[CLLocationManager alloc]init];
self.locationManager.delegate = self;
self.locationManager.distanceFilter = 80.0;
[self.locationManager startUpdatingLocation];

CLGeocoder *geocoder = [[[CLGeocoder alloc] init] autorelease];
[geocoder reverseGeocodeLocation:self.locationManager.location 
   completionHandler:^(NSArray *placemarks, NSError *error) {
       NSLog(@"reverseGeocodeLocation:completionHandler: Completion Handler called!");

       if (error){
           NSLog(@"Geocode failed with error: %@", error);            
           return;

       }

       if(placemarks && placemarks.count > 0)

       {
           //do something   
           CLPlacemark *topResult = [placemarks objectAtIndex:0];
           NSString *addressTxt = [NSString stringWithFormat:@"%@ %@,%@ %@", 
                                   [topResult subThoroughfare],[topResult thoroughfare],
                                   [topResult locality], [topResult administrativeArea]];
           NSLog(@"%@",addressTxt);
       }
   }];

Большое спасибо.

Ответы [ 2 ]

17 голосов
/ 02 марта 2012

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

Кодовые значения 8, 9 и 10:

kCLErrorGeocodeFoundNoResult,
kCLErrorGeocodeFoundPartialResult,
kCLErrorGeocodeCanceled

Исходя из показанного кода, наиболее вероятная причина, по которой вы получите ошибку 8, заключается в том, что она пытается использовать location сразу после вызова startUpdatingLocation, в это время она может быть nil.

Обычно для получения текущего местоположения требуется несколько секунд, и, скорее всего, до этого времени оно будет nil (что приведет к ошибке геокодирования 8 или kCLErrorGeocodeFoundNoResult). Я не уверен, что код ошибки 9 означает «FoundPartialResult», но пример приложения Apple GeocoderDemo рассматривает оба метода одинаково (как «Нет результата»).

Попробуйте переместить код геокодирования (весь код после вызова startUpdatingLocation) в метод делегата locationManager:didUpdateToLocation:fromLocation:. Менеджер местоположений вызовет этот метод делегата, когда он действительно имеет местоположение, и только тогда безопасно использовать location.

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

Вы также можете проверить точность (newLocation.horizontalAccuracy) и возраст (newLocation.timestamp) полученного местоположения, прежде чем пытаться геокодировать его.

1 голос
/ 27 марта 2013

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

...