Saltar al contenido

Lección 13 de 20 · Lectura y práctica

Expo Location React Native: permisos y ejemplo

Respuesta rápida: Expo Location: Para usar ubicación en React Native con Expo, instalá expo-location con npx expo install expo-location, pedí permisos foreground con Location.requestForegroundPermissionsAsync() y después leé.

Del concepto a la práctica

Taller de esta lección

La ubicación es una capacidad condicionada por consentimiento. La aplicación debe explicar para qué la necesita, solicitar permiso en una acción entendible y trabajar con tres resultados: concedido, denegado o error. Nunca trates coordenadas como si estuvieran disponibles por defecto.

Ejemplo resuelto

  1. El usuario pulsa Usar mi ubicación.

  2. Solicita permiso de primer plano y revisa el estado devuelto.

  3. Si se concede, obtiene latitud y longitud.

  4. Si se rechaza, muestra una opción manual como seleccionar ciudad. Un error frecuente es llamar a la lectura de posición al montar la pantalla sin contexto. Corrígelo trasladando la solicitud a la acción visible y tratando la negativa sin reintentos automáticos.

Pruébalo

Prueba tres recorridos: permiso concedido, permiso denegado y excepción simulada del módulo.

Comprueba tu resultado

El primer recorrido muestra dos coordenadas numéricas; el segundo conserva la pantalla usable con alternativa manual; el tercero muestra un error recuperable y no cierra la app.

Permiso, lectura y precisión separados

Instala expo-location con npx expo install. requestForegroundPermissionsAsync se ejecuta tras el botón y se evalúa su granted/status. Si se concede, getCurrentPositionAsync obtiene un LocationObject; permiso no garantiza éxito de lectura. Trata servicios desactivados y excepción; canAskAgain=false permite explicar cómo habilitar desde ajustes, sin volver a pedir indefinidamente.

Valida latitude y longitude finitas dentro de rangos −90..90 y−180..180. Cero es una coordenada válida: no uses if(latitude && longitude). accuracy puede ser null; una cifra numérica estima precisión en metros y no certifica ubicación exacta. Si usas getLastKnownPositionAsync, puede ser null o antiguo y debes etiquetar su timestamp y criterios, en vez de presentarlo como lectura actual. Conserva solo lo necesario, sin imprimir ubicaciones privadas en logs.

En una prueba local inyecta un adaptador: granted devuelve {latitude:0,longitude:0,accuracy:null}, denied no llama leer, error arroja Error('Lectura simulada'). La primera rama muestra0/0 y precisión no disponible; segunda permite ciudad manual; tercera muestra error. Marca claramente estos resultados como simulados, no coordenadas observadas del alumno. Si watchPositionAsync resuelve después del desmontaje, retira también esa suscripción tardía. Location.

Solicitud de permiso lleva a acceso autorizado o denegado, con alternativa y acceso a ajustes del sistema.
CursaloMapa de práctica
Pide permiso cuando hace falta

Solicita el permiso cuando la tarea lo necesita y explica su propósito. Si se deniega, ofrece una alternativa y respeta la decisión; si el sistema ya no permite volver a solicitarlo, orienta hacia ajustes sin prometer acceso.

Ver la infografía en tamaño completo ↗
Respuesta rápida: Expo Location: Para usar ubicación en React Native con Expo, instalá expo-location con npx expo install expo-location, pedí permisos foreground con Location.requestForegroundPermissionsAsync() y después leé coordenadas con Location.getCurrentPositionAsync(). Expo Go sirve para pruebas básicas; usá un development build cuando necesitás configuración nativa o comportamiento parecido a producción.

Expo Location en React Native

Expo Location es el módulo expo-location del Expo SDK para obtener la ubicación del dispositivo en apps React Native. Lo vas a usar en productos con mapas, entregas, comercios cercanos, clima, check-ins, direcciones o formularios que necesitan latitud y longitud.

El flujo profesional es corto pero estricto: instalar la versión compatible, pedir permiso en una acción visible, manejar permiso denegado, obtener coordenadas y probar en un dispositivo o emulador con ubicación configurada. Si la app falla, casi siempre el problema está en permisos, GPS desactivado, simulador sin ubicación o una configuración avanzada que requiere development build.

Qué es Expo SDK en React Native

El Expo SDK reúne APIs para cámara, ubicación, notificaciones, sensores, archivos, pantalla, autenticación y otros módulos nativos usados en apps móviles. En vez de pelear con configuración nativa desde el primer día, podés instalar el módulo correcto, importarlo y probarlo dentro de una app Expo.

Para aprender y crear portfolio, lo más importante es entender el patrón común del Expo SDK: instalar con una versión compatible, pedir permisos en el momento correcto, probar en dispositivo real y saber cuándo Expo Go alcanza o cuándo necesitás un development build.

Qué problema resuelve expo-location

expo-location es el módulo del Expo SDK para obtener ubicación del dispositivo, leer latitud y longitud, verificar permisos, acceder a la última ubicación conocida y, cuando el producto lo justifica, trabajar con ubicación en segundo plano. Para la mayoría de apps iniciales alcanza con foreground location: el usuario toca una acción visible y la app obtiene la ubicación actual.

La parte importante no es memorizar una API aislada, sino respetar el orden: instalar el paquete compatible con tu Expo SDK, solicitar permiso, manejar el caso denegado y recién después leer coordenadas. Si saltás un paso, el error suele parecer de Expo, pero en realidad es de permisos o del simulador sin ubicación configurada.

Expo SDK: módulos más usados para apps reales

Módulo Expo SDKPaqueteUso profesional
Locationexpo-locationMapas, entregas, check-in, comercios cercanos, clima.
Cameraexpo-cameraFotos, escaneo, evidencia, contenido generado por usuarios.
Notificationsexpo-notificationsRecordatorios, alertas de producto, estados de pedidos.
Image Pickerexpo-image-pickerSubir avatar, portfolio, comprobantes o imágenes de producto.
Secure Storeexpo-secure-storeGuardar tokens o datos sensibles con más cuidado que AsyncStorage.

Si buscás "expo sdk", no memorices todos los módulos. Elegí una app concreta, por ejemplo clima con ubicación, diario con foto o perfil con avatar, y aprendé los permisos nativos que necesita.

Instalar expo-location

Dentro de tu proyecto Expo, instalá el paquete con el instalador de Expo para recibir una versión compatible con tu SDK:

npx expo install expo-location

Luego importá el módulo en el componente o hook donde vas a usarlo:

import * as Location from "expo-location";

Pedir permisos de ubicación

En iOS y Android no podés leer ubicación sin autorización del usuario. Para una app que muestra mapas, comercios cercanos, check-in, entregas, clima o contenido local, empezá por permisos foreground:

const { status } = await Location.requestForegroundPermissionsAsync();

if (status !== "granted") {
  throw new Error("Permiso de ubicación denegado");
}

Mostrá un mensaje claro si el permiso fue rechazado. No escondas el error: explicá por qué la app necesita ubicación y dejá una alternativa manual cuando tenga sentido.

Obtener coordenadas actuales

Con permiso concedido, llamá a getCurrentPositionAsync. Para una primera versión, Location.Accuracy.Balanced suele ser suficiente porque evita gastar batería de más y responde bien para muchos casos de uso.

const current = await Location.getCurrentPositionAsync({
  accuracy: Location.Accuracy.Balanced,
});

console.log(current.coords.latitude, current.coords.longitude);

Escuchar cambios con watchPositionAsync

Si la app necesita seguir la ubicación mientras el usuario se mueve, usá Location.watchPositionAsync en lugar de llamar muchas veces a getCurrentPositionAsync. Guardá la suscripción y limpiala al desmontar la pantalla para no gastar batería ni dejar listeners activos.

const subscription = await Location.watchPositionAsync(
  {
    accuracy: Location.Accuracy.Balanced,
    distanceInterval: 25,
  },
  (location) => {
    console.log(location.coords.latitude, location.coords.longitude);
  }
);

subscription.remove();

Usá seguimiento continuo solo cuando el caso lo justifique: mapas, entregas, tracking de actividad o check-ins. Para una app de clima, comercios cercanos o formulario con dirección, una lectura puntual suele alcanzar.

Ejemplo completo con React Native y Expo

Este componente cubre instalación, permiso, loading, error y coordenadas listas para usar en una pantalla real:

import { useState } from "react";
import { Button, Text, View } from "react-native";
import * as Location from "expo-location";

export default function LocationExample() {
  const [coords, setCoords] = useState<Location.LocationObjectCoords | null>(null);
  const [error, setError] = useState<string | null>(null);
  const [loading, setLoading] = useState(false);

  async function loadLocation() {
    setLoading(true);
    setError(null);

    try {
      const { status } = await Location.requestForegroundPermissionsAsync();

      if (status !== "granted") {
        setError("Necesitamos permiso de ubicación para mostrar tu posición.");
        return;
      }

      const current = await Location.getCurrentPositionAsync({
        accuracy: Location.Accuracy.Balanced,
      });

      setCoords(current.coords);
    } catch {
      setError("No se pudo obtener la ubicación. Verificá permisos y GPS.");
    } finally {
      setLoading(false);
    }
  }

  return (
    <View style={{ gap: 12, padding: 24 }}>
      <Button title="Obtener ubicación" onPress={loadLocation} />

      {loading && <Text>Buscando ubicación...</Text>}
      {error && <Text>{error}</Text>}
      {coords && (
        <Text>
          Latitud: {coords.latitude} | Longitud: {coords.longitude}
        </Text>
      )}
    </View>
  );
}

Probar Expo Location en emulador o dispositivo

Si probás en un celular real, verificá que el GPS esté activado y que la app tenga permisos. Si probás en Android Emulator o iOS Simulator, configurá una ubicación simulada desde las herramientas del emulador; si no lo hacés, la app puede quedar esperando o devolver una posición poco útil.

  • Expo Go: sirve para validar el flujo básico de foreground location.
  • Development build: conviene si vas a combinar ubicación con módulos nativos o configuración avanzada.
  • Producción: probá en iOS y Android porque los permisos y mensajes del sistema no se comportan exactamente igual.

Errores comunes con expo-location

ProblemaCausa probableSolución
No devuelve coordenadasPermiso denegado o ubicación del dispositivo apagadaPedí permiso foreground y verificá GPS/emulador.
Funciona en Android pero no en iOSDiferencias de permisos o configuración de appProbá ambos sistemas y revisá mensajes de autorización.
Tarda demasiadoPrecisión alta sin necesidadUsá Location.Accuracy.Balanced o probá última ubicación conocida.
La app consume mucha bateríaSeguimiento continuo sin necesidadUsá watchPositionAsync solo con intervalos y limpieza de suscripción.
Querés tracking en segundo planoBackground location requiere configuración extraNo lo agregues hasta justificar producto, permisos y batería.

Cuándo usar ubicación, cámara y notificaciones juntas

Esta lección pertenece al bloque de Expo SDK porque muchas apps reales combinan varios módulos nativos. Una app de entregas puede guardar ubicación; una app de inspecciones puede tomar foto; una app de reservas puede enviar recordatorios. La clave es no pedir todos los permisos al abrir la app: pedilos cuando el usuario entiende el beneficio.

MóduloPaqueteUso típico
Ubicaciónexpo-locationMapas, check-in, comercios cercanos, entregas.
Cámaraexpo-cameraEscanear, capturar evidencia, crear contenido visual.
Notificacionesexpo-notificationsRecordatorios, alertas transaccionales, seguimiento.

Ejercicio: app de diario con foto y ubicación

Construí una pantalla que permita guardar una entrada con texto, foto y coordenadas. Primero implementá ubicación con expo-location. Después sumá cámara o selector de imagen. Por último, mostrale al usuario una confirmación al guardar.

  1. Creá el proyecto con npx create-expo-app DiarioApp.
  2. Instalá expo-location y validá que podés mostrar latitud/longitud.
  3. Agregá un campo de texto para la nota.
  4. Guardá cada entrada en estado local con fecha, nota y coordenadas.
  5. Probalo en dispositivo real y en emulador con ubicación simulada.

Checklist antes de publicar

  • Instalé expo-location con npx expo install.
  • Pido requestForegroundPermissionsAsync antes de leer coordenadas.
  • Manejo permiso denegado con un mensaje claro.
  • Uso precisión razonable para no gastar batería innecesariamente.
  • Limpio la suscripción si uso watchPositionAsync.
  • Probé la ubicación en iOS y Android, no solo en un navegador.
  • Si necesito background location, lo trato como una función avanzada con configuración propia.

Siguiente paso laboral

La habilidad que buscan muchos proyectos no es solamente "usar Expo", sino conectar permisos, estado de UI, manejo de errores y pruebas reales. Cuando termines esta práctica, subila a tu portfolio y conectala con rutas de empleos tech, cursos de React Native y perfiles de profesionales Cursalo.

Referencias oficiales: Expo Location, Expo Camera y development builds de Expo.

Sigue con React Native con Expo: Desarrollo de Apps Nativas para iOS y Android

Esta lección forma parte de un curso de Cursalo. Revisa su programa y elige entre la compra individual o el acceso a toda la escuela.

Si ya tenías acceso a este curso, entra con tu cuenta: tus derechos y tu progreso se conservan. No necesitas comprarlo de nuevo.

01 / ELEGIR UNA RUTA

El próximo paso

Aprende IA mientras construyes algo que sí necesitas.

Empieza por el curso inicial o explora el catálogo para encontrar una práctica alineada con tu trabajo.