Contenido del curso

Integración Nativa en iOS 18

Cómo leer el acelerómetro con CoreMotion

Resumen

Trabajar con el acelerómetro en iOS te permite capturar movimiento real del dispositivo y convertirlo en funcionalidades como detectores de sacudidas, alertas de caídas o efectos interactivos. Aquí aprendes a integrar CoreMotion con SwiftUI usando CMMotionManager, variables observables y un temporizador para leer datos en tiempo real de los ejes X, Y y Z.

Qué es el acelerómetro y qué datos entrega en iOS

El acelerómetro es un sensor que mide el movimiento del teléfono en tres dimensiones. Cada eje representa una dirección distinta y juntos describen cómo se desplaza el dispositivo en el espacio.

  • Eje X: movimiento horizontal, izquierda y derecha.
  • Eje Y: movimiento vertical, arriba y abajo.
  • Eje Z: profundidad, hacia adelante o hacia atrás.

Con esos tres valores puedes detectar si el usuario camina, agita el teléfono o lo deja caer. Un caso clásico es Facebook: al sacudir el dispositivo dentro de la app, se abre una pantalla para reportar problemas. Ese tipo de interacción nace del acelerómetro [02:10].

¿Qué framework necesito para acceder al acelerómetro en iOS? Necesitas importar CoreMotion, el framework oficial de Apple que expone los sensores de movimiento del dispositivo a través de la clase CMMotionManager.

Cómo configurar CMMotionManager con ObservableObject

El primer paso ocurre dentro de un archivo llamado MotionManager, donde defines la clase que centraliza la lectura del sensor. Esa clase implementa ObservableObject para que SwiftUI pueda observar sus propiedades y refrescar la interfaz cuando los datos cambien [00:50].

Dentro de la clase se declaran tres piezas clave:

  • Una propiedad privada motion de tipo CMMotionManager, que es la puerta de entrada a los sensores.
  • Una propiedad privada timer opcional, que controla cada cuánto se leen los datos.
  • Tres propiedades publicadas con @Published: accelerationX, accelerationY y accelerationZ, todas de tipo Double inicializadas en 0.0.

Esas tres variables son las que tu vista de SwiftUI consumirá directamente. Al ser publicadas, cualquier cambio dispara una actualización visual sin que tengas que mover nada manualmente.

Cómo iniciar la captura de datos del sensor

La función startUpdates se encarga de arrancar todo. Antes de leer cualquier valor, valida que el acelerómetro esté disponible con motion.isAccelerometerAvailable, porque incluso un teléfono con sensor podría tenerlo dañado [04:30].

Si está disponible, la configuración sigue este orden:

  1. Define el intervalo de actualización con motion.accelerometerUpdateInterval = 0.1, es decir, una lectura cada 0.1 segundos.
  2. Llama a motion.startAccelerometerUpdates() para iniciar la captura.
  3. Crea un Timer.scheduledTimer con el mismo intervalo de 0.1 segundos y repeats: true, capturando [weak self] para evitar ciclos de retención.

Dentro del bloque del timer, accedes a motion.accelerometerData y, si hay datos nuevos, actualizas las tres propiedades dentro de un DispatchQueue.main.async. Ese detalle no es opcional: las propiedades observables deben actualizarse en el hilo principal para que la interfaz reaccione correctamente.

swift DispatchQueue.main.async { self?.accelerationX = data.acceleration.x self?.accelerationY = data.acceleration.y self?.accelerationZ = data.acceleration.z }

Por qué necesito una función para detener el sensor

Dejar el acelerómetro encendido cuando la app pasa a segundo plano consume memoria y batería sin sentido. Por eso agregas una función stopUpdates que llama a motion.stopAccelerometerUpdates() y luego invalida el timer con timer?.invalidate() [09:15].

Ese par de líneas libera recursos y deja al dispositivo limpio cuando el usuario sale de la pantalla.

Cómo conectar el acelerómetro con la vista en SwiftUI

En DemoSensoresView declaras una instancia de la clase como @StateObject private var motionManager = MotionManager(). Con eso, SwiftUI mantiene viva la instancia durante el ciclo de vida de la vista y reacciona a sus publicaciones.

La interfaz se arma con un VStack que contiene un título grande con el texto Acelerómetro y tres elementos Text que muestran los valores de cada eje:

  • Text("X: \(motionManager.accelerationX)")
  • Text("Y: \(motionManager.accelerationY)")
  • Text("Z: \(motionManager.accelerationZ)")

Para que las lecturas no aparezcan con decimales infinitos, formateas cada valor con un specifier: "%.2f", dejando solo dos dígitos después del punto decimal. El resultado se ve mucho más limpio en pantalla, sobre todo cuando el sensor entrega valores muy precisos.

Cuándo usar onAppear y onDisappear con sensores

Dos modificadores de SwiftUI orquestan el ciclo de vida del sensor:

  • onAppear ejecuta motionManager.startUpdates() cuando la vista aparece.
  • onDisappear ejecuta motionManager.stopUpdates() cuando la vista desaparece.

Ese patrón asegura que el acelerómetro solo trabaje mientras el usuario está viendo la pantalla. Es la forma correcta de manejar sensores en iOS sin sacrificar batería.

¿Puedo probar el acelerómetro en el simulador de Xcode? No. El simulador no expone movimiento físico, así que verás el mensaje Acelerómetro no disponible por consola. Necesitas un dispositivo real para validar las lecturas en los ejes X, Y y Z.

Para qué sirve el acelerómetro en aplicaciones reales

Una vez que la app corre en un iPhone físico, los valores cambian con cada movimiento: izquierda, derecha, arriba, abajo, adelante o atrás. Esa data abre la puerta a funcionalidades concretas:

  • Detectar sacudidas para activar atajos como reportes o deshacer acciones.
  • Construir detectores de caídas en apps de salud o seguridad.
  • Monitorear movimientos nocturnos o patrones de sueño.
  • Aplicar efectos visuales que respondan a la inclinación del dispositivo.

¿Qué funcionalidad construirías tú con el acelerómetro? Cuéntame en los comentarios qué idea probarías primero con CMMotionManager.