iOS – Obtener coordenadas del GPS del iPhone o iPad

Vamos a realizar un sencillo tutorial sobre como obtener la posición del GPS del iPhone o iPad.

El proceso será muy sencillo.

 

Creamos un nuevo proyecto en Xcode de tipo Single View Application. Lo vamos a llamar LocationTutorial y activamos el ARC (Automatic Reference Counting).

 

 Single View Application - Apprendemos.com

 

Location Tutorial - Apprendemos.com

 

[wp_ad_camp_2] 

 

Lo primero que vamos a necesitar es importar el Framework CoreLocation, el cual se encargará de manejar los sistemas  de geolocalización de nuestro iPhone.

Para ello pinchamos sobre el proyecto -> Build Phases y en Link Binary With Libraries pulsamos sobre “+” para buscar y añadir el FrameWork CoreLocation.

 

 

 CoreLocation Framework - Apprendemos.com

 

 

Una vez añadido al proyecto, abrimos el ViewController.h y lo dejamos de la siguiente forma:

#import <UIKit/UIKit.h>
 
//Importamos el CoreLocation
#import <CoreLocation/CoreLocation.h>
 
                                            //Añadimos el delegate
@interface ViewController : UIViewController 
{
    CLLocationManager *locationManager;
    float longitud;
    float latitud;
 
    IBOutlet UILabel *latitudLabel;
    IBOutlet UILabel *longitudLabel;
}
 
//Lo añadimos tb como property
@property(nonatomic, retain) CLLocationManager *locationManager;
 
 
@end

 

 

[wp_ad_camp_2]

Acto seguido pasamos a implementar el viewDidLoad del ViewController.m. Aquí inicializamos el LocationManager encargado de la geolocalización, lo configuramos y lo activamos para actualizar la posición.

 

@synthesize locationManager;
 
- (void)viewDidLoad
{
    [super viewDidLoad];
 
    // Inicializamos el CLLocationManager
    self.locationManager = [[CLLocationManager alloc] init];
 
    /* 
 
     Los posibles valores para la precisión (desiredAccuracy) del GPS son:
 
     - kCLLocationAccuracyBestForNavigation:
        Pensado para la navegación por GPS ofrece la máxima precisión combinada con información de otros sensores. Está pensada para utilizarse con el dispotivio conectado por el alto consumo de batería.
 
     - kCLLocationAccuracyBest:
        Usa el mayor nivel de precisión posible.
 
     - kCLLocationAccuracyNearestTenMeters:
        Utiliza una precisión de 10 metros sobre la posición real.
 
     - kCLLocationAccuracyHundredMeters:
       Utiliza una precisión de 100 metros sobre la posición real.
 
     - kCLLocationAccuracyKilometer:
       Utiliza una precisión de 1 kilómetro sobre la posición real.
 
     - kCLLocationAccuracyThreeKilometers:
        Utiliza un precisión de 3 kilómetros sobre la posición real. 
 
     Cuanto menos precisa es la localización, menos batería consumirá.
 
     */
 
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
 
    /*
     La propiedad "distanceFilter" define cuando notificará el terminal a la aplicación sobre cambios en la posición.
     Por defecto el valor será kCLDistanceFilterNone que notificará ante cualquier cambio por mínimo que sea.
 
     En caso contrario introduciremos los metros de distancia necesarios. Si ponemos distanceFilter = 25, cuando el usuario se desplace al rededor de 25 metros, el método correspondiente será llamado.
 
 
     */
    self.locationManager.distanceFilter = kCLDistanceFilterNone;
 
    if([CLLocationManager locationServicesEnabled]){
        self.locationManager.delegate = self;
 
 
        [self.locationManager startUpdatingLocation];
    }
 
 
}

 

[wp_ad_camp_2]

En función de la funcionalidad que necesitemos utilizaremos el método una sola vez o en cada cambio de posición del usuario. Para nuestro ejemplo lo vamos a mantener activo en cada movimiento.

Para controlar esta actualización de posición añadimos el método del delegate del CoreLocation:

 

//En este método utilizo las coordenadas y puedo parar o no la actualización de posición.
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
 
    // Si solo lo necesitamos una vez podemos dejar de actualizar las coordenadas aunque el usuario se mueva.
 
    // [self.locationManager stopUpdatingLocation];
 
    // Si necesitamos una precisión bastante buena, dejaremos unos segundos para que siga actualizando antes de pararlo, ya que la primera vez suele devolver la última posición recogida, por el iOS o por cualquier otra aplicación.
 
    // Si no lo paramos, el método será llamado en función de la precisión establecida cada X metros.
 
 
    //Obtenemos las coordenadas.
    latitud = newLocation.coordinate.latitude;
    longitud = newLocation.coordinate.longitude;
 
    // Lo mostramos en las etiquetas
    latitudLabel.text = [NSString stringWithFormat:@"%0.8f",latitud];
    longitudLabel.text = [NSString stringWithFormat:@"%0.8f",longitud];
 
}

 

Ahora solo queda implementar una sencilla interfaz. Añadimos 4 etiquetas (UILabel) a nuestro ViewController.xib. Dos fijas para título y dos que conectamos con los IBOutlet.

 UILabel IBOutlet - Apprendemos.com

 

IBOutlet UILabel - Apprendemos.com

 

 

Podemos adornar nuestra vista a nuestro gusto, poniendo por ejemplo un fondo como este.

 

Y ya pasamos a probarlo. En este punto es recomendable contar con un dispotivo. No obstante no es necesario, podemos utilizar el simulador e ir cambiando la ubicación del usuario. Un forma sencilla es elegir en la barra de herramientas:

Depurar -> Ubicación -> Apple Stores. Esta opción va cambiando entre las coordenadas de las distintas Apple Stores (En las que por cierto a día de hoy ya hay cola para la compra del iPhone 5). Un ejemplo curioso que nos sirve para comprobar que funciona.

Y como vemos tenemos el resultado esperado:

 Use Location - Apprendemos.com

 

Latitud Longitud - Apprendemos.com

 

Core Location - Apprendemos.com

 

 

Esperamos que os haya gustado este tutorial de obtener la posición y coordenadas del usuario del iPhone o iPad en cualquier momento, y os sirva una vez más en vuestros proyectos actuales y futuros.

[wp_ad_camp_1] 

Si os gusta, seguirnos en Twitter y darle Me Gusta o Compartir en Facebook.

 

Como siempre, dudas y comentarios aquí abajo.

 

Saludos, Manu =D

Author Image
Author: ManuAlamar iOS & .NET Developer. Ingeniero Técnico Informático especialmente interesado en proyectos relacionados con la tecnología móvil y web
  • carlos

    Perdona la pregunta:
    ¿como se le pone el fondo a la vista?.

    Gracias.

  • El fondo se le debe de poner en la configuracion inicial del proyecto donde elegimos si es para iphone, ipad o universal y decidimos que tipos de vistas soporta ahi abajo existe una parte donde dice imagen de fondo y hay para el iphone y ipad quiero creer que es ahi.

    Ahora con respecto al codigo me funciono muy bien muchas gracias solo tengo una duda en la parte del codigo que dice
    self.locationManager.delegate = self;
    me manda una advertencia eso no impidio que corriera mi aplicacion pero me hace ruido que me mande esa advertencia a que se debera?

    la advertencia que me manda es la siguiente:
    “Assigning to ‘id from incompatible type ‘MainViewController *const_strong’

  • juan

    Hola excelente tutorial, por casualidad no sabras como se obtiene la fecha y velocidad?

    Gracias…

  • Dany

    Como detectas que se cambio la posicion con la app en segundo plano????

  • Pingback: Bitacoras.com()