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
El usuario pulsa
Usar mi ubicación.Solicita permiso de primer plano y revisa el estado devuelto.
Si se concede, obtiene latitud y longitud.
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.

Mapa de prácticaSolicita 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 ↗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 SDK | Paquete | Uso profesional |
|---|---|---|
| Location | expo-location | Mapas, entregas, check-in, comercios cercanos, clima. |
| Camera | expo-camera | Fotos, escaneo, evidencia, contenido generado por usuarios. |
| Notifications | expo-notifications | Recordatorios, alertas de producto, estados de pedidos. |
| Image Picker | expo-image-picker | Subir avatar, portfolio, comprobantes o imágenes de producto. |
| Secure Store | expo-secure-store | Guardar 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
| Problema | Causa probable | Solución |
|---|---|---|
| No devuelve coordenadas | Permiso denegado o ubicación del dispositivo apagada | Pedí permiso foreground y verificá GPS/emulador. |
| Funciona en Android pero no en iOS | Diferencias de permisos o configuración de app | Probá ambos sistemas y revisá mensajes de autorización. |
| Tarda demasiado | Precisión alta sin necesidad | Usá Location.Accuracy.Balanced o probá última ubicación conocida. |
| La app consume mucha batería | Seguimiento continuo sin necesidad | Usá watchPositionAsync solo con intervalos y limpieza de suscripción. |
| Querés tracking en segundo plano | Background location requiere configuración extra | No 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ódulo | Paquete | Uso típico |
|---|---|---|
| Ubicación | expo-location | Mapas, check-in, comercios cercanos, entregas. |
| Cámara | expo-camera | Escanear, capturar evidencia, crear contenido visual. |
| Notificaciones | expo-notifications | Recordatorios, 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.
- Creá el proyecto con
npx create-expo-app DiarioApp. - Instalá
expo-locationy validá que podés mostrar latitud/longitud. - Agregá un campo de texto para la nota.
- Guardá cada entrada en estado local con fecha, nota y coordenadas.
- Probalo en dispositivo real y en emulador con ubicación simulada.
Checklist antes de publicar
- Instalé
expo-locationconnpx expo install. - Pido
requestForegroundPermissionsAsyncantes 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.