CLGeocoder reverseGeocodeLocation возвращает ошибку kCLErrorDomain 9

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

Но когда я тестирую это на симуляторе, я получаю «ошибку kCLErrorDomain 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);
       }
   }];

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


person Yejun Su    schedule 02.03.2012    source источник
comment
Симулятор теперь возвращает ошибку 8, в то время как я ничего не делал со своим кодом.   -  person Yejun Su    schedule 02.03.2012
comment
CLLocationManager, CLGeocoder Не будет работать на симуляторе. Он будет отображать результаты только при отладке на устройстве или тестировании на устройстве. На симуляторе будет отображаться ошибка.   -  person Mobile App Dev    schedule 16.10.2012
comment
Это работает как шарм на моем устройстве iPhone 4. Спасибо!   -  person gstroup    schedule 03.01.2013
comment
Убедитесь, что вы моделируете местоположение в симуляторе.   -  person Daniel    schedule 11.09.2014


Ответы (2)


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

Кодовые значения 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) полученного местоположения, прежде чем пытаться его геокодировать.

person Community    schedule 02.03.2012
comment
Спасибо. После перемещения моего кода в соответствии с вашим советом он показывает ошибку 9, даже если я установил для своего CCLocation значение CLLocation *location = [[CLLocation alloc] initWithLatitude:37.78583400 longitude:-122.40641700];. Может на симуляторе какая-то ошибка, собираюсь протестировать на своем устройстве. - person Yejun Su; 02.03.2012

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

person Jim    schedule 27.03.2013