CoreLocation y CoreLocationManager
La framework CoreLocation nos permite obtener datos de posicionamiento del dispositivo; sin embargo, los datos que nos da son de latitud y longitud (y algo más). Si sólo queremos mostrar la posición en un mapa, con eso y la framework MapKit tenemos más que suficiente. No obstante, si lo que queremos es la dirección de la posición estaríamos apañados, si no fuese por CLGeocoder.
CLGeocoder al rescate: Geocodificación inversa
La clase CLGeocoder nos permiter hacer geocodificación directe e inversa (forward geocoding & reverse geocoding):
En este caso nos interesa la geocodificación inversa: a partir de unas coordenadas que obtendremos de un CLLocationManager, queremos saber la dirección a la que corresponden.
El método que tenemos que llamar es reverseGeocodeLocation:completionHandler: Acepta dos parámetros, uno la CLLocation (es decir, las coordenadas) y un bloque que se ejecutará cuando reciba los datos de la red. Ten en cuenta que aunque el método retorna de inmediato, hace una conexión en segundo plano con algún servicio online. Por eso hace falta pasarle un bloque para que lo ejecute cuando el servicio online le haya devuelto la dirección.
Aplicación de geocodificación de ejemplo: AndeEstoy.app
La aplicación es muy sencilla, tiene un botón que realiza la geocodificación inversa:
En este momento se inicia la geocodificación inversa: se está conectando a un servicio web.
Se ha obtenido una dirección para la longitud y latitud que el hemos pasado. Esto viene en un objeto de tipo CLPlacemark del cual extraemos los componentes de la dirección.
El código más importante del proyecto de ejemplo es el addressFromLocation:
El código completo está en este zip(AndeEstoy) (gitHub me anda dando problemas).