Lo que tienes que hacer es configurar una CLLocationManager
que encuentre tus coordenadas actuales. Con las coordenadas actuales que necesita usar MKReverseGeoCoder
para encontrar su ubicación.
- (void)viewDidLoad
{
// this creates the CCLocationManager that will find your current location
CLLocationManager *locationManager = [[[CLLocationManager alloc] init] autorelease];
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
[locationManager startUpdatingLocation];
}
// this delegate is called when the app successfully finds your current location
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
// this creates a MKReverseGeocoder to find a placemark using the found coordinates
MKReverseGeocoder *geoCoder = [[MKReverseGeocoder alloc] initWithCoordinate:newLocation.coordinate];
geoCoder.delegate = self;
[geoCoder start];
}
// this delegate method is called if an error occurs in locating your current location
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
NSLog(@"locationManager:%@ didFailWithError:%@", manager, error);
}
// this delegate is called when the reverseGeocoder finds a placemark
- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFindPlacemark:(MKPlacemark *)placemark
{
MKPlacemark * myPlacemark = placemark;
// with the placemark you can now retrieve the city name
NSString *city = [myPlacemark.addressDictionary objectForKey:(NSString*) kABPersonAddressCityKey];
}
// this delegate is called when the reversegeocoder fails to find a placemark
- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFailWithError:(NSError *)error
{
NSLog(@"reverseGeocoder:%@ didFailWithError:%@", geocoder, error);
}
¡A partir de iOS 5
MKReverseGeoCoder
está obsoleto!Así que quieres usarlo
CLGeocoder
conCLLocationManager
, muy simple y funciona con block.Ejemplo:
Editar: en lugar de un
for in
bucle, también puede hacer:fuente
Esto está funcionando bien para mí:
fuente
kCLErrorDomain error 8
, ¿sabes por qué?Si alguien está intentando pasar a CLGeocoder desde MKReverseGeocoder, entonces he escrito una publicación de blog que podría ser de ayuda http://jonathanfield.me/jons-blog/clgeocoder-example.html
Básicamente, un ejemplo sería, después de haber creado los objetos locationManager y CLGeocoder, simplemente agregue este código a su viewDidLoad () y luego cree algunas etiquetas o áreas de texto para mostrar los datos.
fuente
nil
enviará mensajes paranil
darnil
como resultado , así como el acceso a la propiedad a través de la notación de puntos a través denil
. Dicho esto, siempre se debe verificar sierror
no esnil
.Si alguien lo necesita en Swift 3 , así es como lo hice:
fuente
Después de configurar CLLocationManager, obtendría la actualización de la ubicación como un par de latitud / longitud. Luego, podría usar CLGeocoder para convertir las coordenadas en un nombre de lugar fácil de usar.
Aquí está el código de muestra en Swift 4 .
fuente
Debe obtener la ubicación actual del usuario y luego usar MKReverseGeocoder para reconocer la ciudad.
Hay un gran ejemplo en la Guía de programación de aplicaciones para iPhone , capítulo 8. Una vez que tenga la ubicación, inicialice el geocodificador, configure el delegado y lea el país en la marca de posición. Lea la documentación de MKReverseGeocodeDelegate y cree métodos:
reverseGeocoder: didFailWithError:
fuente
Puede utilizar este código para obtener la ciudad actual: -
extensión YourController: CLLocationManagerDelegate {func locationManager (administrador: CLLocationManager, ubicaciones didUpdateLocations: [CLLocation]) {
fuente
fuente
Aquí está mi pequeña clase Swift que me ayuda a obtener información geocodificada inversa sobre la ubicación actual. No se olvide del
NSLocationWhenInUseUsageDescription
campo de entradaInfo.plist
.fuente
Lea la documentación de MKReverseGeocoder : Apple proporciona la documentación, las guías y las aplicaciones de muestra por una razón.
fuente