Получить текущий город и страну от CLGeocoder?
Я был в Интернете, пытаясь выяснить, как получить город и страну от CLGeocoder
, Я легко могу получить долготу и широту, но мне нужна информация о городе и стране, и я продолжаю сталкиваться с устаревшими методами и тому подобным, есть идеи? Это в основном нужно, чтобы получить местоположение, а затем иметь NSString
для страны, и NSString
для города, так что я могу использовать их, чтобы найти больше информации или разместить их на этикетках и т. д.
1 ответ
Вам нужно немного пересмотреть свою терминологию - CLGeocoder (и большинство геокодеров) не даст вам "город" как таковой - он использует такие термины, как "Административная область", "Субадминистративная область" и т. Д. Объект CLGeocoder вернет массив объектов CLPlacemark, которые вы можете затем запросить необходимую информацию. Вы запускаете CLGeocoder и вызываете функцию reverseGeocodeLocation с местоположением и блоком завершения. Вот пример:
if (osVersion() >= 5.0){
CLGeocoder *reverseGeocoder = [[CLGeocoder alloc] init];
[reverseGeocoder reverseGeocodeLocation:self.currentLocation completionHandler:^(NSArray *placemarks, NSError *error)
{
DDLogVerbose(@"reverseGeocodeLocation:completionHandler: Completion Handler called!");
if (error){
DDLogError(@"Geocode failed with error: %@", error);
return;
}
DDLogVerbose(@"Received placemarks: %@", placemarks);
CLPlacemark *myPlacemark = [placemarks objectAtIndex:0];
NSString *countryCode = myPlacemark.ISOcountryCode;
NSString *countryName = myPlacemark.country;
DDLogVerbose(@"My country code: %@ and countryName: %@", countryCode, countryName);
}];
}
Теперь обратите внимание, что CLPlacemark не имеет свойства 'city'. Полный список свойств можно найти здесь: CLPlacemark Class Reference
Вы можете получить код города, страны и ISO страны, используя это (Swift 5):
private func getAddress(from coordinates: CLLocation) {
CLGeocoder().reverseGeocodeLocation(coordinates) { placemark, error in
guard error == nil,
let placemark = placemark
else
{
// TODO: Handle error
return
}
if placemark.count > 0 {
let place = placemark[0]
let city = place.locality
let country = place.country
let countryIsoCode = place.isoCountryCode
}
}
}