:::: MENU ::::

Obtener latitud y longitud en aplicación iPhone

5.00 avg. rating (88% score) - 2 votes

Un pequeño manual para los que necesiten utilizar la ubicación actual del usuario en su aplicación iPhone o iPad.

Podríamos afrontarlo de dos formas diferentes, una derivando la clase CLLocationManager y añadiendo allí nuestra funcionalidad, y la segunda creando una instancia de dicha clase en la clase de nuestro proyecto donde necesitemos utilizar la ubicación actual.

Cualquiera de las dos formas es perfectamente válida y hacerlo de un modo u otro dependerá de las operaciones que necesitemos realizar con la ubicación y de las preferencias de cada uno. En este caso explicaremos la segunda de las formas.

Lo primero de todo, necesitaremos trabajar con el Frameword CoreLocation, así que tendremos que incluirlo en el fichero de cabecera de la clase donde vayamos a utilizar la localización.

#import <CoreLocation/CoreLocation.h>

En el mismo fichero tendremos que indicar nuestra clase implementa el interfaz CLLocationManagerDelegate, lo que permitirá a nuestra clase recibir los eventos de nuestra instancia CLLocationManager.

Ademas crearemos nuestra variable para guardar la referencia a CLLocationManager.

#import <CoreLocation/CoreLocation.h>

@interface MiClase : NSObject <CLLocationManagerDelegate> {

  // Referencia a la instancia
  CLLocationManager *locationManager;
}

// Declaramos la propiedad para no crear el setter y el getter correspondiente
@property (nonatomic, retain) CLLocationManager *locationManager;

@end

Ahora vamos con el fichero de implementación:

El primer paso, como siempre, indicar que queremos que el compilador cree los métodos de set y get para nuestras propiedades declaradas. Para el caso de nuestra variable.

@synthesize locationManager;

A continuación, en algún lugar o función de nuestra clase, deberemos crear la instancia del CLLocationManager. Algo así:

// Creamos la instancia...
self.locationManager = [[[CLLocationManager alloc] init] autorelease];
// ... e indicamos que esta clase es el delegado para los eventos
self.locationManager.delegate = self;

También es necesario iniciar el proceso de localización (al llamar a este método, el dispositivo pregunta automáticamente al usuario si permite a la aplicación utilizar la ubicación actual).

[locationManager startUpdatingLocation];

Finalmente sólo nos queda procesar los eventos que nos envíe el locationManager. Para el caso más sencillo necesitamos implementar únicamente dos funciones, una que nos da los datos de la posición y otra que nos reporta errores (por ejemplo si el usuario no permite que la aplicación obtenga la ubicación).

Para procesar los errores, implementaremos el método didFailWithError:

- (void)locationManager: (CLLocationManager *)manager didFailWithError: (NSError *)error {
  NSLog(@"NO HAY GEOLOCALIZACION");
}

Y para recibir los datos de posición implementaremos el método didUpdateToLocation:

- (void)locationManager: (CLLocationManager *)manager didUpdateToLocation: (CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {

  // Obtenemos latitud y longitud...
  double lat = [[NSString stringWithFormat:@"%.7f",newLocation.coordinate.latitude] doubleValue];
  double lon = [[NSString stringWithFormat:@"%.7f",newLocation.coordinate.longitude] doubleValue];
  // ... y por ejemplo, lo mostramos en el log
  NSLog(@"Latitud: %f", lat);
  NSLog(@"Latitud: %f", lon);
}

Para finalizar, si en algún momento queremos dejar de recibir actualizaciones de la ubicación actual, simplemente tendremos que llamara al método correspondiente:

[manager stopUpdatingLocation];



4 Comments

  • Responder Alberto |

    No funciona! Me tira este error…

    Undefined symbols for architecture i386:
    «_OBJC_CLASS_$_CLLocationManager», referenced from:
    objc-class-ref in AppDelegate.o
    ld: symbol(s) not found for architecture i386
    clang: error: linker command failed with exit code 1 (use -v to see invocation)

    • Responder Daniel Navarro |

      Disculpa, pero es cierto que no está del todo bien explicado. Cuando dice «necesitaremos trabajar con el Frameword CoreLocation, así que tendremos que incluirlo en el fichero de cabecera» quiere decir que tienes que añadir el framework CoreLocation.framework.

      Para ello, ve a tu «Target» y luego a Build Phases, y añádelo al proyecto. Te debería compilar sin problema.

Hey! Qué opinas sobre el artículo?