2012-03-02 3 views
12

Я разрабатываю приложение IOS с обратным геокодированием Характеристики согласно этой статье: geocoding tutorialCLGeocoder reverseGeocodeLocation возвращает «kCLErrorDomain ошибки 9»

Но когда я проверяю, как это на тренажере, я получаю «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); 
     } 
    }]; 

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

+0

Симулятор возвращает ошибку 8, пока я ничего не сделал с моим кодом. – goofansu

+1

CLLocationManager, CLGeocoder Не будет работать на симуляторе. Он отображает результаты только при отладке на устройстве или тестировании на устройстве. На симуляторе появится ошибка. –

+0

Это работает как шарм на моем устройстве iPhone 4. Благодаря! – gstroup

ответ

16

Коды ошибок ввода ядра documented here.

Код значения 8, 9 и 10 являются:

kCLErrorGeocodeFoundNoResult, 
kCLErrorGeocodeFoundPartialResult, 
kCLErrorGeocodeCanceled 

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

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

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

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

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

+0

Спасибо. После переноса моего кода в соответствии с вашими советами он показывает ошибку 9, даже если я установил свой CCLocation как 'CLLocation * location = [[CLLocation alloc] initWithLatitude: 37.78583400 longitude: -122.40641700];'. Может быть, на симуляторе что-то происходит, я собираюсь протестировать его на своем устройстве. – goofansu

1

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

Смежные вопросы