Concepto clave
Los sensores del dispositivo son componentes hardware que capturan datos del entorno físico, como aceleración, orientación, luz o proximidad. En desarrollo móvil, acceder a estos sensores permite crear experiencias inmersivas y contextuales. Expo Sensors proporciona una capa unificada para interactuar con estos sensores sin necesidad de código nativo, simplificando el desarrollo multiplataforma.
Imagina que estás construyendo una aplicación de fitness que usa el acelerómetro para contar pasos, o un juego que utiliza el giroscopio para controlar movimientos. Sin Expo Sensors, tendrías que escribir código específico para iOS y Android, aumentando la complejidad. Con Expo Sensors, usas una API JavaScript consistente, similar a cómo un control remoto universal opera diferentes marcas de televisores con los mismos botones.
Cómo funciona en la práctica
Expo Sensors funciona mediante módulos que exponen métodos para suscribirse a actualizaciones de sensores. Primero, instalas el paquete correspondiente (por ejemplo, expo-sensors). Luego, importas el sensor específico y usas sus métodos para iniciar la escucha. Los datos llegan como objetos JavaScript con propiedades como x, y, z para movimiento, o brightness para luz.
Paso a paso: 1) Importa el sensor desde expo-sensors. 2) Usa useEffect en React para manejar el ciclo de vida. 3) Llama a Sensor.addListener para suscribirte a actualizaciones. 4) Procesa los datos en una función callback. 5) Limpia el listener al desmontar el componente para evitar fugas de memoria. Esto asegura que la aplicación responda en tiempo real a cambios del sensor.
Codigo en accion
Aquí un ejemplo funcional que usa el acelerómetro para mostrar datos de movimiento en una app Expo:
import React, { useState, useEffect } from 'react';
import { Text, View, StyleSheet } from 'react-native';
import { Accelerometer } from 'expo-sensors';
export default function App() {
const [data, setData] = useState({ x: 0, y: 0, z: 0 });
useEffect(() => {
const subscription = Accelerometer.addListener(accelerometerData => {
setData(accelerometerData);
});
Accelerometer.setUpdateInterval(100); // Actualiza cada 100ms
return () => subscription.remove();
}, []);
return (
x: {data.x.toFixed(2)}\ny: {data.y.toFixed(2)}\nz: {data.z.toFixed(2)}
);
}
const styles = StyleSheet.create({
container: { flex: 1, justifyContent: 'center', alignItems: 'center' },
text: { fontSize: 18 }
});Antes de optimizar, podrías olvidar limpiar el listener, causando fugas. Después, con el return en useEffect, garantizas que se remueva al desmontar. Para mejorar, podrías agregar un umbral para filtrar datos mínimos y ahorrar batería:
// Mejora: Filtrar datos menores a 0.1
useEffect(() => {
const subscription = Accelerometer.addListener(accelerometerData => {
if (Math.abs(accelerometerData.x) > 0.1 || Math.abs(accelerometerData.y) > 0.1 || Math.abs(accelerometerData.z) > 0.1) {
setData(accelerometerData);
}
});
Accelerometer.setUpdateInterval(100);
return () => subscription.remove();
}, []);Errores comunes
- No limpiar listeners: Olvidar remover suscripciones en
useEffectcausa fugas de memoria y errores en actualizaciones. Siempre usa un return para limpiar. - Intervalos de actualización muy rápidos: Configurar intervalos menores a 16ms (60fps) puede saturar el hilo principal y drenar batería. Usa valores como 100-500ms según la necesidad.
- Asumir disponibilidad del sensor: No todos los dispositivos tienen todos los sensores. Verifica con
Sensor.isAvailableAsync()antes de usarlos. - Ignorar permisos: Algunos sensores requieren permisos en tiempo de ejecución. Usa
expo-permissionso APIs modernas para solicitarlos. - Procesar datos en el hilo principal: Operaciones complejas con datos de sensores pueden bloquear la UI. Mueve el procesamiento a un Web Worker si es intensivo.
Checklist de dominio
- Instalar y configurar Expo Sensors en un proyecto Expo.
- Implementar al menos dos sensores diferentes (ej., acelerómetro y giroscopio) con suscripciones.
- Manejar correctamente el ciclo de vida de listeners con useEffect y cleanup.
- Optimizar el intervalo de actualización para balancear rendimiento y precisión.
- Verificar disponibilidad del sensor y permisos antes de usarlo.
- Probar la app en dispositivos reales para validar el comportamiento del sensor.
- Documentar el uso de sensores en el código para mantenibilidad.
Crear una brújula digital con Expo Sensors
Desarrolla una aplicación que muestre una brújula digital usando el magnetómetro de Expo Sensors. Sigue estos pasos:
- Crea un nuevo proyecto Expo con
npx create-expo-app compass-app. - Instala Expo Sensors:
npx expo install expo-sensors. - En
App.js, importaMagnetometerdeexpo-sensorsy componentes de React Native. - Usa
useStatepara almacenar el ángulo de orientación yuseEffectpara suscribirte al magnetómetro. - Calcula el ángulo en grados desde los datos del magnetómetro (x, y) usando
Math.atan2(y, x) * (180 / Math.PI). - Muestra el ángulo en una pantalla con un texto y una imagen que rote según la orientación.
- Agrega un botón para calibrar el sensor reiniciando los datos.
- Prueba la app en un dispositivo físico moviéndolo para ver cambios en tiempo real.
- Usa
Magnetometer.setUpdateInterval(100)para actualizaciones suaves. - Normaliza el ángulo a 0-360 grados con
(angle + 360) % 360para evitar valores negativos. - Para la rotación de imagen, aplica un estilo
transform: [{ rotate: `${angle}deg` }].
Evalua tu comprension
Completa el quiz interactivo de arriba para ganar XP.