Получить текущий город и страну от CLGeocoder?

Я по всему интернету пытался узнать, как получить город и страну от CLGeocoder. Я могу легко получить долготу и широту, но мне нужна информация о городе и стране, и я продолжаю использовать устаревшие методы и т.д. Любые идеи? В основном нужно получить местоположение, затем NSString для страны и NSString для города, поэтому я могу использовать их для поиска дополнительной информации или размещения их на ярлыках и т.д.

Ответ 1

Вам нужно немного пересмотреть свою терминологию - CLGeocoder (и большинство геокодеров) не даст вам "город" per-se - он использует такие термины, как "Административная область", "Субадминистративная зона" и т.д. 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

Ответ 2

С помощью этого кода (Swift 5) вы можете получить код города, страны и iso страны:

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
        }
    }
}