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