Contenido del curso

Integración Nativa en iOS 18

Geolocalización nativa con CoreLocation en iOS

Resumen

Aprende a integrar geolocalización en una app iOS usando CoreLocation y MapKit de forma nativa, sin dependencias externas. Esta guía te muestra cómo capturar la ubicación del dispositivo, manejar permisos sensibles y mostrarla en un mapa interactivo dentro de SwiftUI, ideal para desarrolladores que construyen apps de rastreo, delivery o navegación.

Por qué usar CoreLocation en lugar de librerías externas

Apple ya te entrega todo lo necesario para trabajar con ubicación, así que sumar dependencias externas suele ser innecesario. CoreLocation es el framework nativo que gestiona el GPS del dispositivo y entrega coordenadas precisas, mientras que Foundation aporta las herramientas base para construir tu ViewModel [00:32].

La idea es crear una clase llamada LocationViewModel que herede de NSObject, implemente el protocolo CLLocationManagerDelegate y adopte ObservableObject. Esa combinación permite que las vistas SwiftUI reaccionen automáticamente a cada cambio de ubicación.

¿Qué es CLLocationManagerDelegate? Es el protocolo de CoreLocation que delega en tu clase la responsabilidad de recibir actualizaciones de ubicación. Sin él, no puedes saber cuándo el GPS reporta una nueva coordenada.

Cómo configurar el LocationManager y los permisos

Dentro del ViewModel necesitas una propiedad publicada con @Published que guarde la ubicación, y otra para instanciar el administrador. La propiedad location es de tipo CLLocationCoordinate2D?, opcional porque puede que el GPS no detecte señal, por ejemplo, dentro de un ascensor o un sótano con paredes gruesas [02:25].

La instancia locationManager es de tipo CLLocationManager, y se inicializa directamente. En el override init() configuras tres cosas clave:

  • Asignar el delegado con locationManager.delegate = self.
  • Definir la precisión deseada con desiredAccuracy = kCLLocationAccuracyBest.
  • Solicitar autorización con requestWhenInUseAuthorization().

La precisión controla el margen de error en metros. Puedes elegir entre la mejor precisión posible o una más laxa de 10, 20 o 50 metros, dependiendo de qué tan exacto necesites el dato [04:10].

Por qué los permisos de ubicación son obligatorios

La ubicación es información sensible y Apple exige declarar el uso explícitamente. Necesitas ir a la raíz del proyecto, seleccionar el target, abrir la sección Info y añadir la clave Privacy - Location When In Use Usage Description con un texto claro sobre por qué tu app necesita acceso [05:50].

Si el usuario rechaza el permiso, el diálogo no vuelve a aparecer y debe activarse manualmente desde la configuración del sistema. Por eso el texto que pongas debe ser convincente y honesto sobre el uso real.

Cómo recibir actualizaciones de ubicación en tiempo real

Una vez autorizado el acceso, llamas a locationManager.startUpdatingLocation() para iniciar la captura. A partir de ese momento, CoreLocation reporta nuevas coordenadas a través de la función delegada locationManager(_:didUpdateLocations:) [07:45].

Esta función recibe dos parámetros: el manager de tipo CLLocationManager y un array didUpdateLocations con objetos CLLocation ordenados cronológicamente. Mientras más tiempo pasa, más precisas son las coordenadas reportadas.

Dentro de esa función haces tres cosas:

  1. Validar que exista la última ubicación con locations.last.
  2. Saltar al hilo principal con DispatchQueue.main.async.
  3. Actualizar la propiedad publicada con location.coordinate.

Ejecutar la actualización en el hilo principal es crítico, porque SwiftUI solo refleja cambios de UI desde ese hilo. Si lo haces en background, las vistas no se actualizan.

¿Qué pasa si no hay señal GPS? CoreLocation devuelve la última ubicación almacenada por el dispositivo, así que casi siempre tendrás un dato disponible aunque no sea exacto en ese instante.

Cómo mostrar la ubicación en un mapa con MapKit

En la vista DemoLocalization declaras una referencia al ViewModel con @StateObject var viewModel = LocationViewModel(). Eso te da acceso reactivo a las coordenadas desde cualquier punto del diseño [10:30].

Para mostrar latitud y longitud en texto, accedes a viewModel.location?.latitude y viewModel.location?.longitude. Como son opcionales, conviene usar el operador ?? para mostrar un valor por defecto si la ubicación aún no se obtuvo.

Cómo simular ubicaciones en el simulador de Xcode

El simulador no tiene GPS real, así que debes simular coordenadas manualmente. En el menú Features > Location del simulador encuentras opciones como Apple, City Run, City Bicycle Ride y Custom Location [12:50].

La opción Custom Location te deja ingresar latitud y longitud específicas. Si modificas esos números mientras la app corre, verás cómo el ícono de localización aparece en la barra de estado y las coordenadas se actualizan en pantalla, simulando movimiento.

Cómo agregar un marcador dinámico en el mapa

Dentro del Map agregas un Marker con dos parámetros: el texto de la etiqueta y coordinate, que recibe el viewModel.location. Si no hay ubicación disponible, mandas una coordenada por defecto para evitar errores.

Para mejorar la experiencia visual, envuelves el mapa en un ZStack y usas el modificador .safeAreaInset(edge: .bottom) para superponer un panel con la latitud y longitud actuales. Dentro de ese panel, un HStack con Spacer a los lados y un VStack central distribuye los textos de forma limpia.

Con esto ya tienes la base de funcionalidades de rastreo en tiempo real: apps de delivery que muestran dónde va tu pedido, fitness trackers o navegación turística. ¿Qué app construirías tú con esta funcionalidad? Cuéntame en los comentarios.