tutoriales.com

Aprovechando la API de Sensores en PWAs: Realidad Aumentada y Experiencias Inmersivas

Este tutorial profundiza en la integración de la API de Sensores genérica en Progressive Web Apps (PWAs) para desbloquear nuevas capacidades interactivas. Aprenderás a acceder a datos de acelerómetro, giroscopio y magnetómetro, habilitando experiencias de realidad aumentada, navegación contextual y juegos inmersivos directamente en el navegador.

Intermedio18 min de lectura15 views
Reportar error

La evolución de las Progressive Web Apps (PWAs) no solo se centra en la mejora de la experiencia de usuario offline o la capacidad de instalación, sino también en la expansión de sus capacidades para interactuar con el hardware del dispositivo. Una de las áreas más emocionantes es la API de Sensores, que permite a las PWAs acceder a datos de acelerómetros, giroscopios, magnetómetros y otros sensores, abriendo la puerta a experiencias de usuario enriquecidas, como la realidad aumentada, la navegación contextual y los juegos inmersivos.

Tradicionalmente, el acceso a estos sensores era exclusivo de las aplicaciones nativas. Sin embargo, con la API de Sensores genérica, los desarrolladores web ahora pueden aprovechar estas poderosas capacidades, eliminando las barreras entre la web y el nativo.


🚀 ¿Qué es la API de Sensores Genérica?

La API de Sensores genérica es un conjunto de interfaces que exponen los sensores de un dispositivo al entorno web de una manera unificada y segura. En lugar de tener APIs separadas para cada tipo de sensor (como la antigua DeviceMotion o DeviceOrientation), la API de Sensores proporciona un modelo consistente para acceder a una variedad de datos de sensores, incluyendo:

  • Acelerómetro: Mide la aceleración lineal del dispositivo, útil para detectar movimiento, caídas o gestos.
  • Giroscopio: Mide la velocidad angular de rotación del dispositivo, esencial para el seguimiento de la orientación y la estabilización.
  • Magnetómetro: Mide el campo magnético ambiental, utilizado para brújulas o detectores de metales.
  • Sensor de Orientación: Combina datos de acelerómetro y giroscopio (y a veces magnetómetro) para proporcionar la orientación absoluta del dispositivo en el espacio 3D.
💡 Consejo: La API de Sensores genérica simplifica enormemente la gestión de sensores, ya que proporciona una interfaz consistente sin importar el tipo de sensor.

Ventajas clave de la API de Sensores

  • Unificación: Un modelo consistente para múltiples tipos de sensores.
  • Seguridad y Privacidad: Requiere HTTPS y, en algunos casos, permisos explícitos del usuario. Los datos se entregan en el contexto del documento de origen, evitando el acceso no autorizado.
  • Rendimiento: Diseñada para ser eficiente y no sobrecargar el hilo principal del navegador.
  • Extensibilidad: Facilita la adición de nuevos tipos de sensores en el futuro.

🛠️ Requisitos y Permisos

Antes de sumergirnos en el código, es crucial entender los requisitos de seguridad y permisos para utilizar la API de Sensores.

HTTPS es Obligatorio

Al igual que muchas APIs modernas del navegador que acceden a características del dispositivo, la API de Sensores solo puede ser utilizada en contextos seguros, lo que significa que tu PWA debe ser servida a través de HTTPS. Esto es fundamental para proteger la privacidad y la integridad de los datos del usuario.

Política de Permisos (Permissions Policy)

La API de Sensores utiliza la Permissions Policy (anteriormente Feature Policy) para controlar el acceso a los sensores. Para utilizar sensores en un iframe, por ejemplo, deberás especificarlo explícitamente. Sin embargo, para una PWA estándar en el top-level browsing context, generalmente no se requiere una configuración explícita, ya que los permisos se manejan a través de la API de Permisos.

La API de Permisos (Permissions API)

Algunos sensores pueden requerir el consentimiento explícito del usuario. Puedes verificar el estado de los permisos y solicitarlos utilizando la API de Permisos.

async function checkSensorPermission() {
  try {
    const result = await navigator.permissions.query({ name: 'accelerometer' });
    if (result.state === 'granted') {
      console.log('Permiso de acelerómetro concedido.');
      return true;
    } else if (result.state === 'prompt') {
      console.log('Se solicitará permiso para el acelerómetro.');
      // En este punto, el navegador podría mostrar un prompt al intentar iniciar el sensor.
      return false;
    } else if (result.state === 'denied') {
      console.warn('Permiso de acelerómetro denegado por el usuario.');
      return false;
    }
  } catch (error) {
    console.error('Error al consultar permiso:', error);
    return false;
  }
}

// Ejemplo de uso
checkSensorPermission().then(granted => {
  if (!granted) {
    // Informar al usuario o guiarlo para que conceda el permiso si es necesario
  }
});
⚠️ Advertencia: No todos los sensores requieren un prompt explícito del usuario. Los sensores de movimiento, como el acelerómetro y giroscopio, a menudo lo hacen en algunos navegadores por motivos de privacidad. Siempre es buena práctica consultar el permiso.

📐 Sensores Comunes y Cómo Usarlos

Exploraremos cómo trabajar con los sensores más comunes y cómo interpretar sus datos.

Acelerómetro (Accelerometer)

El acelerómetro mide la aceleración aplicada al dispositivo en tres ejes (X, Y, Z), excluyendo la gravedad. Es útil para detectar movimientos, sacudidas o golpes.

if ('Accelerometer' in window) {
  const accelerometer = new Accelerometer({
    frequency: 60 // Leer 60 veces por segundo
  });

  accelerometer.addEventListener('reading', e => {
    // La aceleración se mide en m/s^2
    document.getElementById('accel-x').innerText = accelerometer.x.toFixed(2);
    document.getElementById('accel-y').innerText = accelerometer.y.toFixed(2);
    document.getElementById('accel-z').innerText = accelerometer.z.toFixed(2);
  });

  accelerometer.addEventListener('error', event => {
    if (event.error.name === 'NotAllowedError') {
      console.error('Permiso de acelerómetro denegado o bloqueado.');
    } else if (event.error.name === 'NotReadableError') {
      console.error('Sensor no disponible o lectura fallida.');
    }
    console.error('Error del acelerómetro:', event.error);
  });

  accelerometer.start();
  console.log('Acelerómetro iniciado.');
} else {
  console.warn('Acelerómetro no soportado en este navegador.');
  document.getElementById('status').innerText = 'Acelerómetro no soportado';
}

Los valores x, y, z representan la aceleración lineal a lo largo de los respectivos ejes. Un valor de 0 significa que no hay aceleración a lo largo de ese eje (o que la aceleración es constante).

📌 Nota: Los ejes X, Y, Z se definen en el sistema de coordenadas del dispositivo. Generalmente, X es hacia la derecha, Y es hacia arriba y Z es hacia el exterior de la pantalla.

Sensor de Gravedad (GravitySensor)

Una extensión del acelerómetro que reporta la dirección de la gravedad. Útil para determinar la orientación "hacia abajo" del dispositivo.

if ('GravitySensor' in window) {
  const gravitySensor = new GravitySensor({ frequency: 60 });

  gravitySensor.addEventListener('reading', e => {
    document.getElementById('gravity-x').innerText = gravitySensor.x.toFixed(2);
    document.getElementById('gravity-y').innerText = gravitySensor.y.toFixed(2);
    document.getElementById('gravity-z').innerText = gravitySensor.z.toFixed(2);
  });

  gravitySensor.addEventListener('error', event => {
    console.error('Error del sensor de gravedad:', event.error);
  });

  gravitySensor.start();
  console.log('Sensor de gravedad iniciado.');
} else {
  console.warn('Sensor de gravedad no soportado.');
}

Giroscopio (Gyroscope)

El giroscopio mide la velocidad angular de rotación alrededor de los ejes X, Y, Z del dispositivo. Es fundamental para detectar el giro y la inclinación.

if ('Gyroscope' in window) {
  const gyroscope = new Gyroscope({
    frequency: 60 // Leer 60 veces por segundo
  });

  gyroscope.addEventListener('reading', e => {
    // La velocidad angular se mide en grados/s o radianes/s (dependiendo de la implementación, usualmente rad/s)
    document.getElementById('gyro-x').innerText = (gyroscope.x * (180 / Math.PI)).toFixed(2); // Convertir a grados/s
    document.getElementById('gyro-y').innerText = (gyroscope.y * (180 / Math.PI)).toFixed(2);
    document.getElementById('gyro-z').innerText = (gyroscope.z * (180 / Math.PI)).toFixed(2);
  });

  gyroscope.addEventListener('error', event => {
    if (event.error.name === 'NotAllowedError') {
      console.error('Permiso de giroscopio denegado o bloqueado.');
    } else if (event.error.name === 'NotReadableError') {
      console.error('Sensor no disponible o lectura fallida.');
    }
    console.error('Error del giroscopio:', event.error);
  });

  gyroscope.start();
  console.log('Giroscopio iniciado.');
} else {
  console.warn('Giroscopio no soportado en este navegador.');
  document.getElementById('status').innerText = 'Giroscopio no soportado';
}

Magnetómetro (Magnetometer)

El magnetómetro detecta la fuerza del campo magnético local. Se usa a menudo para orientar una brújula o para detectar la presencia de metales.

if ('Magnetometer' in window) {
  const magnetometer = new Magnetometer({
    frequency: 10 // Leer 10 veces por segundo
  });

  magnetometer.addEventListener('reading', e => {
    // La intensidad del campo magnético se mide en microteslas (μT)
    document.getElementById('mag-x').innerText = magnetometer.x.toFixed(2);
    document.getElementById('mag-y').innerText = magnetometer.y.toFixed(2);
    document.getElementById('mag-z').innerText = magnetometer.z.toFixed(2);
  });

  magnetometer.addEventListener('error', event => {
    console.error('Error del magnetómetro:', event.error);
  });

  magnetometer.start();
  console.log('Magnetómetro iniciado.');
} else {
  console.warn('Magnetómetro no soportado en este navegador.');
  document.getElementById('status').innerText = 'Magnetómetro no soportado';
}

Sensor de Orientación (OrientationSensor)

El sensor de orientación es uno de los más potentes, ya que fusiona los datos del acelerómetro, giroscopio y (opcionalmente) magnetómetro para proporcionar la orientación absoluta del dispositivo en el espacio 3D. Esto es crucial para la realidad aumentada y la navegación espacial.

Hay dos tipos principales:

  • AbsoluteOrientationSensor: Proporciona la orientación relativa al sistema de coordenadas de la Tierra (requiere magnetómetro). Puede requerir permisos.
  • RelativeOrientationSensor: Proporciona la orientación relativa al sistema de coordenadas del dispositivo cuando se inicia (no requiere magnetómetro y suele tener menos restricciones de permiso).

Ambos sensores devuelven la orientación como un cuaternión, que es una forma eficiente y libre de gimbal lock de representar rotaciones 3D. Un cuaternión tiene cuatro componentes: x, y, z, w.

// Ejemplo de AbsoluteOrientationSensor
if ('AbsoluteOrientationSensor' in window) {
  const orientationSensor = new AbsoluteOrientationSensor({
    frequency: 60,
    referenceFrame: 'device'
  });

  orientationSensor.addEventListener('reading', e => {
    // Cuaternión [x, y, z, w]
    const quaternion = orientationSensor.quaternion;
    if (quaternion) {
      document.getElementById('quat-x').innerText = quaternion[0].toFixed(2);
      document.getElementById('quat-y').innerText = quaternion[1].toFixed(2);
      document.getElementById('quat-z').innerText = quaternion[2].toFixed(2);
      document.getElementById('quat-w').innerText = quaternion[3].toFixed(2);

      // Para visualización, a menudo se convierte a ángulos de Euler (roll, pitch, yaw)
      const rotationMatrix = new Float32Array(16);
      orientationSensor.populateMatrix(rotationMatrix);
      // Aquí se usaría la matriz de rotación o el cuaternión para renderizar contenido 3D.
    }
  });

  orientationSensor.addEventListener('error', event => {
    if (event.error.name === 'NotAllowedError') {
      console.error('Permiso de sensor de orientación denegado o bloqueado.');
    } else {
      console.error('Error del sensor de orientación:', event.error);
    }
  });

  orientationSensor.start();
  console.log('AbsoluteOrientationSensor iniciado.');
} else {
  console.warn('AbsoluteOrientationSensor no soportado.');
}
🔥 Importante: Los cuaterniones son la forma preferida de manejar rotaciones 3D en computación gráfica para evitar problemas de *gimbal lock*. Si no estás familiarizado con ellos, muchas bibliotecas 3D (como Three.js o Babylon.js) pueden ayudarte a trabajar con ellos.

🌐 Detección de Soporte y Fallbacks

Es crucial que tu PWA sea robusta y funcione incluso si la API de Sensores no está disponible o si el usuario deniega los permisos. Siempre debes verificar la disponibilidad de los sensores antes de intentar usarlos.

function initSensors() {
  if ('Accelerometer' in window) {
    // Inicializar acelerómetro
    console.log('Acelerómetro disponible.');
  } else {
    console.warn('Acelerómetro no disponible.');
    // Implementar fallback o deshabilitar funcionalidad dependiente
  }

  if ('Gyroscope' in window) {
    // Inicializar giroscopio
    console.log('Giroscopio disponible.');
  } else {
    console.warn('Giroscopio no disponible.');
  }

  if ('AbsoluteOrientationSensor' in window) {
    // Inicializar sensor de orientación
    console.log('AbsoluteOrientationSensor disponible.');
  } else if ('RelativeOrientationSensor' in window) {
    // Usar RelativeOrientationSensor como fallback
    console.log('AbsoluteOrientationSensor no disponible, usando RelativeOrientationSensor.');
  } else {
    console.warn('Ningún sensor de orientación disponible.');
  }
}

initSensors();

Tabla de soporte para sensores comunes:

SensorNombres de interfaz Web APIChromeFirefox (Desktop)Firefox (Android)EdgeSafari (iOS)Safari (macOS)
------------------------
AcelerómetroAccelerometer
Sensor de GravedadGravitySensor
------------------------
GiroscopioGyroscope
MagnetómetroMagnetometer, UncalibratedMagnetometer
------------------------
Orientación (Absoluta)AbsoluteOrientationSensor
Orientación (Relativa)RelativeOrientationSensor
⚠️ Advertencia: El soporte de la API de Sensores varía significativamente entre navegadores. Firefox, por ejemplo, tiene un soporte limitado o inexistente en algunas plataformas. Siempre consulta [caniuse.com](https://caniuse.com/?search=sensors) para la información más actualizada.

🎨 Casos de Uso y Aplicaciones Creativas

La API de Sensores desbloquea un sinfín de posibilidades para enriquecer las PWAs.

Realidad Aumentada (AR) en el Navegador

Uno de los casos de uso más impactantes es la AR. Combinando la orientación del dispositivo (AbsoluteOrientationSensor) con la vista de la cámara (MediaDevices.getUserMedia) y una biblioteca 3D (como Three.js o A-Frame), puedes superponer objetos virtuales en el mundo real.

Inicio Acceder Cámara (getUserMedia) Acceder Sensores (AbsoluteOrientationSensor) Renderizar 3D (Three.js/A-Frame) y superponer en video Fin

Juegos Inmersivos

Desde un shooter donde el jugador apunta moviendo el teléfono, hasta un juego de laberinto donde inclina el dispositivo para mover una bola. El giroscopio y el acelerómetro son esenciales para estos tipos de interacción.

Navegación y Mapas Contextuales

Imagina una aplicación de mapas que te indica hacia dónde debes girar el dispositivo para ver los puntos de interés cercanos en esa dirección, usando el magnetómetro como brújula y el giroscopio para la inclinación.

Monitoreo de Actividad Física

Aunque no es un reemplazo de dispositivos específicos, el acelerómetro puede usarse para contar pasos o detectar patrones de movimiento básicos en una PWA de fitness.

Controles de Interfaz de Usuario Avanzados

Agita para deshacer, inclina para desplazarte, gira para cambiar de vista. Pequeñas interacciones que mejoran la experiencia de usuario.


⚡ Optimización y Buenas Prácticas

Para garantizar que tus PWAs basadas en sensores sean eficientes y ofrezcan una gran experiencia de usuario, sigue estas recomendaciones:

Frecuencia de Lectura

No necesitas la máxima frecuencia posible para todas las aplicaciones. Ajusta el frequency del sensor a lo que realmente necesitas. Menos lecturas significan menos consumo de batería y CPU.

  • Baja Frecuencia (1-10 Hz): Para actualizaciones ocasionales, como orientación general de la brújula.
  • Media Frecuencia (30-60 Hz): Para UI reactivas y algunos juegos.
  • Alta Frecuencia (>60 Hz): Solo para aplicaciones muy exigentes como AR o VR, donde la latencia es crítica.
Frecuencia Moderada

Detener Sensores Cuando No se Usan

Siempre llama a sensor.stop() cuando la página no esté visible, cuando el usuario cambia de pestaña, o cuando la funcionalidad de sensor ya no es necesaria. Esto conserva la batería del dispositivo.

// Ejemplo usando la API de Visibilidad de Página
document.addEventListener('visibilitychange', () => {
  if (document.hidden) {
    if (accelerometer && accelerometer.activated) {
      accelerometer.stop();
      console.log('Acelerómetro detenido (página oculta).');
    }
  } else {
    if (accelerometer && !accelerometer.activated) {
      accelerometer.start();
      console.log('Acelerómetro reanudado (página visible).');
    }
  }
});

Manejo de Errores Robusto

Implementa manejadores de errores para cada sensor (addEventListener('error', ...)) para informar al usuario sobre problemas de permisos o sensores no disponibles.

Debouncing y Throttling

Si procesas los datos del sensor para actualizar la UI o realizar cálculos costosos, considera usar técnicas de debouncing o throttling para limitar la frecuencia de ejecución de tu lógica y evitar sobrecargar el hilo principal.

let lastUpdate = 0;
const updateInterval = 100; // ms

accelerometer.addEventListener('reading', e => {
  const now = Date.now();
  if (now - lastUpdate > updateInterval) {
    // Realizar actualizaciones de UI o lógica costosa aquí
    document.getElementById('accel-x').innerText = accelerometer.x.toFixed(2);
    lastUpdate = now;
  }
});

Consideraciones de Accesibilidad

Algunos usuarios pueden no ser capaces de interactuar con el dispositivo de la manera que lo exige una aplicación basada en sensores. Siempre ofrece métodos alternativos de interacción o una interfaz de usuario tradicional cuando sea posible.


💡 Ejemplos Prácticos y Snippets de Código

Veamos cómo montar un pequeño demo de visualización de datos de acelerómetro y giroscopio.

Estructura HTML

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>PWA Sensores Demo</title>
    <style>
        body { font-family: sans-serif; display: flex; flex-direction: column; align-items: center; margin-top: 20px; }
        .sensor-data { margin: 10px 0; padding: 15px; border: 1px solid #ccc; border-radius: 8px; width: 300px; text-align: left; }
        .sensor-data h3 { margin-top: 0; color: #333; }
        .sensor-data p { margin: 5px 0; }
        .sensor-status { color: gray; font-size: 0.9em; margin-top: 10px; }
    </style>
</head>
<body>
    <h1>Demo de Sensores PWA</h1>
    <p>Mueve tu dispositivo para ver los datos de los sensores en tiempo real.</p>
    <div class="sensor-data">
        <h3>Acelerómetro</h3>
        <p>X: <span id="accel-x">N/A</span> m/s²</p>
        <p>Y: <span id="accel-y">N/A</span> m/s²</p>
        <p>Z: <span id="accel-z">N/A</span> m/s²</p>
        <p class="sensor-status" id="accel-status"></p>
    </div>
    <div class="sensor-data">
        <h3>Giroscopio</h3>
        <p>X: <span id="gyro-x">N/A</span> °/s</p>
        <p>Y: <span id="gyro-y">N/A</span> °/s</p>
        <p>Z: <span id="gyro-z">N/A</span> °/s</p>
        <p class="sensor-status" id="gyro-status"></p>
    </div>

    <script src="app.js"></script>
</body>
</html>

Lógica JavaScript (app.js)

// Función para inicializar y manejar el acelerómetro
function initAccelerometer() {
    if ('Accelerometer' in window) {
        const accelerometer = new Accelerometer({ frequency: 30 });
        const accelX = document.getElementById('accel-x');
        const accelY = document.getElementById('accel-y');
        const accelZ = document.getElementById('accel-z');
        const accelStatus = document.getElementById('accel-status');

        accelerometer.addEventListener('reading', () => {
            accelX.innerText = accelerometer.x ? accelerometer.x.toFixed(2) : 'N/A';
            accelY.innerText = accelerometer.y ? accelerometer.y.toFixed(2) : 'N/A';
            accelZ.innerText = accelerometer.z ? accelerometer.z.toFixed(2) : 'N/A';
        });

        accelerometer.addEventListener('error', event => {
            accelStatus.innerText = `Error: ${event.error.name} - ${event.error.message}`;
            console.error('Error del acelerómetro:', event.error);
        });

        accelerometer.start();
        accelStatus.innerText = 'Acelerómetro: Activo';
        console.log('Acelerómetro iniciado.');
    } else {
        document.getElementById('accel-status').innerText = 'Acelerómetro: No soportado';
        console.warn('Acelerómetro no soportado en este navegador.');
    }
}

// Función para inicializar y manejar el giroscopio
function initGyroscope() {
    if ('Gyroscope' in window) {
        const gyroscope = new Gyroscope({ frequency: 30 });
        const gyroX = document.getElementById('gyro-x');
        const gyroY = document.getElementById('gyro-y');
        const gyroZ = document.getElementById('gyro-z');
        const gyroStatus = document.getElementById('gyro-status');

        gyroscope.addEventListener('reading', () => {
            // Convertir de radianes/s a grados/s para una mejor lectura
            gyroX.innerText = gyroscope.x ? (gyroscope.x * (180 / Math.PI)).toFixed(2) : 'N/A';
            gyroY.innerText = gyroscope.y ? (gyroscope.y * (180 / Math.PI)).toFixed(2) : 'N/A';
            gyroZ.innerText = gyroscope.z ? (gyroscope.z * (180 / Math.PI)).toFixed(2) : 'N/A';
        });

        gyroscope.addEventListener('error', event => {
            gyroStatus.innerText = `Error: ${event.error.name} - ${event.error.message}`;
            console.error('Error del giroscopio:', event.error);
        });

        gyroscope.start();
        gyroStatus.innerText = 'Giroscopio: Activo';
        console.log('Giroscopio iniciado.');
    } else {
        document.getElementById('gyro-status').innerText = 'Giroscopio: No soportado';
        console.warn('Giroscopio no soportado en este navegador.');
    }
}

// Iniciar todos los sensores al cargar la página
document.addEventListener('DOMContentLoaded', () => {
    // Primero, verificar permisos (opcional, el .start() también los solicita)
    navigator.permissions.query({ name: 'accelerometer' }).then(result => {
        if (result.state === 'granted' || result.state === 'prompt') {
            initAccelerometer();
        } else {
            document.getElementById('accel-status').innerText = 'Acelerómetro: Permiso denegado';
        }
    });
    
    navigator.permissions.query({ name: 'gyroscope' }).then(result => {
        if (result.state === 'granted' || result.state === 'prompt') {
            initGyroscope();
        } else {
            document.getElementById('gyro-status').innerText = 'Giroscopio: Permiso denegado';
        }
    });
});

Para probar este ejemplo, necesitas servirlo a través de HTTPS. Puedes usar herramientas como http-server con un certificado SSL, o simplemente desplegarlo en plataformas como Netlify, Vercel o GitHub Pages con soporte HTTPS.


🔮 El Futuro de los Sensores en la Web

La API de Sensores genérica es un paso fundamental hacia una web más inmersiva y consciente del contexto. El trabajo continúa para estandarizar más sensores y mejorar las capacidades existentes. Podríamos ver en el futuro acceso a:

  • Sensores de luz ambiental: Para ajustar el brillo de la pantalla automáticamente.
  • Sensores de proximidad: Para detectar si un objeto está cerca de la pantalla (útil en llamadas telefónicas).
  • Sensores de humedad/temperatura: Para aplicaciones ambientales o de salud.

Estos avances seguirán difuminando la línea entre las aplicaciones web y nativas, empoderando a las PWAs con un acceso sin precedentes a las capacidades del hardware.

Preguntas Frecuentes sobre la API de Sensores
  • ¿Puedo usar la API de Sensores sin un Service Worker? Sí, la API de Sensores funciona independientemente de los Service Workers. Sin embargo, para que tu aplicación sea una PWA completa (instalable, offline), un Service Worker es esencial.
  • ¿Qué pasa si el dispositivo no tiene un sensor específico? Si un sensor no está presente, la propiedad global del constructor (ej. `window.Accelerometer`) será `undefined` o el método `start()` de la instancia del sensor lanzará un error `NotReadableError`. Siempre verifica la disponibilidad y maneja los errores.
  • ¿Cuál es la diferencia entre `AbsoluteOrientationSensor` y `RelativeOrientationSensor`? `AbsoluteOrientationSensor` proporciona la orientación con respecto al sistema de coordenadas de la Tierra, lo que significa que un dispositivo que se mantiene quieto siempre apuntará en la misma dirección geográfica. `RelativeOrientationSensor` proporciona la orientación relativa a la posición del dispositivo cuando se inició, por lo que su `(0,0,0)` es el momento de inicio y no una dirección absoluta.

✅ Conclusión

La API de Sensores genérica es una adición increíblemente poderosa al arsenal de desarrollo de Progressive Web Apps. Al permitir el acceso seguro y eficiente a los datos del hardware, abre las puertas a una nueva generación de experiencias web, desde la realidad aumentada hasta juegos inmersivos y aplicaciones contextuales.

Si bien el soporte aún está en evolución en algunos navegadores, las capacidades que ofrece son inmensas para aquellos que buscan llevar sus PWAs al siguiente nivel de interactividad y enganche. ¡Es hora de empezar a experimentar y construir el futuro de la web!

Tutoriales relacionados

Comentarios (0)

Aún no hay comentarios. ¡Sé el primero!