Il framework Core Motion è un componente di sistema iOS che fornisce accesso ai dati di accelerometro, giroscopio, magnetometro e podometro sui dispositivi Apple. Secondo la Apple Developer Documentation, 2025, il framework elabora i dati grezzi dei sensori e li converte in metriche comprensibili — accelerazione, velocità angolare, orientamento e numero di passi. Un'unica API per tutti i sensori di movimento consente agli sviluppatori di creare podometri, app fitness e giochi con controllo tramite inclinazione del dispositivo.
Punti chiave
Core Motion è un framework di sistema di Apple, introdotto in iOS 4 per lavorare con i sensori di movimento del dispositivo. Fornisce un'interfaccia unificata per accedere ad accelerometro, giroscopio, magnetometro e podometro, liberando lo sviluppatore dalla necessità di lavorare con driver hardware a basso livello.
Il vantaggio principale di Core Motion è il filtraggio hardware dei dati. Il framework combina automaticamente le letture dell'accelerometro e del giroscopio per calcolare la userAcceleration pura senza la componente gravitazionale e fornisce anche l'orientamento del dispositivo nello spazio sotto forma di quaternioni e angoli di Eulero.
Secondo Apple WWDC 2023, Core Motion è utilizzato in oltre l'80% delle app fitness sull'App Store. Il framework è ottimizzato per il consumo energetico — la frequenza di polling dei sensori diminuisce automaticamente quando non ci sono abbonati, prolungando la durata della batteria del dispositivo.
Una caratteristica architetturale importante è l'uso del coprocessore della serie M (Motion coprocessor), che elabora i dati dei sensori di movimento indipendentemente dal processore principale della serie A. A partire dal chip M7 (iPhone 5S), il coprocessore raccoglie continuamente dati dell'accelerometro e del giroscopio, consentendo a CMPedometer e CMAltimeter di funzionare in background con lo schermo bloccato consumando meno di 1 mW. Ciò è stato reso possibile grazie all'isolamento hardware: il coprocessore ha la propria memoria non volatile e un bus dati indipendente dal sistema principale.
L'architettura di Core Motion è basata su un modello singleton attraverso CMMotionManager. L'applicazione ottiene una singola istanza del manager e attraverso di essa configura la frequenza di aggiornamento, avvia o arresta la raccolta dati per ogni tipo di sensore. I dati arrivano attraverso blocchi di closure all'intervallo specificato.
Il framework utilizza due modalità di acquisizione dati: pull (polling attivo tramite startAccelerometerUpdates) e push (ricezione passiva tramite startAccelerometerUpdatesToQueue). La modalità push è preferibile per le applicazioni UI poiché i dati vengono consegnati alla coda specificata senza bloccare il thread principale.
import CoreMotion
let motionManager = CMMotionManager()
motionManager.accelerometerUpdateInterval = 0.1
guard motionManager
.isAccelerometerAvailable else { return }
motionManager.startAccelerometerUpdates(
to: OperationQueue.current()!
) { data, _ in
guard let accel = data?.acceleration else { return }
print("X: \(accel.x), Y: \(accel.y), Z: \(accel.z)")
}
Core Motion fornisce accesso a quattro categorie di sensori: l'accelerometro misura l'accelerazione lineare su tre assi, il giroscopio misura la velocità angolare di rotazione e il magnetometro misura l'intensità del campo magnetico per la bussola. La quarta categoria sono i dati combinati di CMDeviceMotion, che includono letture filtrate di tutti i sensori.
CMDeviceMotion è la classe più preziosa per lo sviluppo. Fornisce userAcceleration (accelerazione senza gravità), rotationRate (velocità di rotazione), magneticField (vettore del campo magnetico) e attitude (orientamento del dispositivo come quaternione o angoli di Eulero). Per calcolare attitude, Core Motion utilizza la fusione dei sensori del giroscopio e dell'accelerometro con un algoritmo simile a un filtro complementare.
Il magnetometro viene utilizzato per la correzione della deriva del giroscopio. Un giroscopio puro accumula errori nel tempo a causa della deriva termica e del rumore — il magnetometro e l'accelerometro correggono questo errore, fornendo una precisione di orientamento di 1–2 gradi in posizione statica.
guard motionManager
.isDeviceMotionAvailable else { return }
motionManager.deviceMotionUpdateInterval = 1.0 // 1 Hz
motionManager.startDeviceMotionUpdates(
using: .xArbitraryZVertical,
to: OperationQueue.current()!
) { motion, _ in
guard let attitude = motion?.attitude else { return }
print("Roll: \(attitude.roll)")
print("Pitch: \(attitude.pitch)")
print("Yaw: \(attitude.yaw)")
}
CMPedometer — una classe per contare passi, distanza percorsa e ritmo di movimento. Utilizza i dati dell'accelerometro con elaborazione hardware sul coprocessore di movimento della serie M (M7/M8/M9/M10/M11). Ciò consente il funzionamento in background con un consumo energetico minimo — circa l'1% di batteria per 8 ore di tracciamento continuo.
CMAltimeter — una classe per determinare l'altitudine relativa basata sul barometro installato nell'iPhone 6 e successivi. Mostra il cambiamento di altitudine rispetto al punto di partenza con una precisione di circa 1 metro. Viene utilizzato nelle app fitness per contare i piani e nelle app di navigazione per determinare i cambi di elevazione.
I dati di CMPedometer sono disponibili con un ritardo non superiore a 5 secondi per le letture correnti. Per i dati storici, è disponibile una consultazione fino a 7 giorni tramite queryPedometerData. Il podometro riconosce automaticamente camminata, corsa e ciclismo — questi tipi di attività sono disponibili tramite queryPedometerData con filtraggio per tipo.
La precisione di CMPedometer è di circa il 95% durante la camminata normale e diminuisce al 90% durante la corsa. La precisione è influenzata da: posizione del telefono in tasca o zaino, tipo di scarpe e superficie. Apple raccomanda di utilizzare CMPedometer in combinazione con Core Location per la determinazione della distanza all'aperto — il GPS fornisce una distanza più precisa mentre Core Motion gestisce il conteggio dei passi.
let pedometer = CMPedometer()
guard CMPedometer
.isStepCountingAvailable() else { return }
pedometer.startUpdates(from: Date()) { data, _ in
guard let pedData = pedometerData else { return }
print("Passi: \(pedData.numberOfSteps)")
print("Distanza: \(pedData.distance)")
}
// Accesso all'altimetro
let altimeter = CMAltimeter()
altimeter.startRelativeAltitudeUpdates(
to: OperationQueue.current()!
) { data, _ in
print("Altitudine: \(data?.relativeAltitude)")
}
L'integrazione di Core Motion non richiede autorizzazioni speciali o entitlement — basta aggiungere l'import del framework e creare un'istanza di CMMotionManager. Tuttavia, per CMPedometer a partire da iOS 11, è necessaria l'autorizzazione tramite CMStepCounter o utilizzando CMPedometer con un dialogo di permesso di sistema.
Il processo di integrazione include: creare un CMMotionManager, verificare la disponibilità del sensore tramite isAccelerometerAvailable / isGyroAvailable / isDeviceMotionAvailable, impostare l'intervallo di aggiornamento e avviare la raccolta dati. È importante arrestare gli aggiornamenti tramite stopAccelerometerUpdates quando i dati non sono più necessari — questo è critico per il consumo energetico.
Per il funzionamento in background, CMPedometer e CMAltimeter non richiedono configurazione aggiuntiva — utilizzano il coprocessore di movimento. Per CMMotionManager, il funzionamento in background non è disponibile — i dati vengono raccolti solo quando l'app è attiva e in primo piano. L'unica condizione per CMPedometer è che l'app deve essere stata avviata almeno una volta dall'utente dopo l'installazione per inizializzare la sottoscrizione agli aggiornamenti in background da iOS.
Core Motion supporta la frequenza di polling adattiva: se l'app non necessita di dati in tempo reale, è sufficiente impostare l'intervallo su 1–5 Hz invece di 100 Hz. Per le app fitness, la frequenza ottimale è 10 Hz per CMMotionManager e 1 Hz per CMPedometer. Apple raccomanda di ridurre la frequenza al minimo necessario per il corretto funzionamento.
Per i giochi con controllo tramite inclinazione, è necessaria una frequenza di 60–100 Hz per garantire una risposta fluida. In questo caso, è importante utilizzare startDeviceMotionUpdates con una coda separata ed elaborare i dati il più rapidamente possibile. Secondo Apple, 60 Hz consuma circa 2 volte più energia di 30 Hz.
Quando si lavora con Core Motion, è importante considerare la compatibilità del dispositivo: il giroscopio è assente su iPhone 3GS e iPad 1ª generazione, il magnetometro è assente su tutti gli iPad senza modulo cellulare. I metodi statici isAccelerometerAvailable, isGyroAvailable e isDeviceMotionAvailable della classe CMMotionManager vengono utilizzati per verificare la disponibilità dei sensori. Sul simulatore, Core Motion restituisce dati di test — per il debug su un sensore reale, è sempre necessario un dispositivo Apple fisico.
// Impostazione ottimale per app fitness
motionManager.deviceMotionUpdateInterval = 0.1 // 10 Hz
motionManager.startDeviceMotionUpdates(
to: .main
) { [weak self] motion, error in
guard let self = self,
let motion = motion else { return }
if motion.userAcceleration.magnitude() > 2.0 {
self.detectedSignificantMovement()
}
}
Domande frequenti
Sì, Core Motion funziona su tutti i dispositivi Apple con i sensori necessari. L'accelerometro è disponibile su tutti gli iPhone, iPad e iPod touch. Il giroscopio è disponibile su tutti gli iPhone 4 e successivi, iPad 2 e successivi. Il magnetometro è disponibile solo su iPhone, non su iPad. Il barometro è disponibile su iPhone 6 e successivi.
L'impatto sulla batteria dipende dalla frequenza di polling. A 100 Hz, Core Motion consuma circa il 5–7% di batteria all'ora. A 10 Hz — circa l'1–2% all'ora. CMPedometer sul coprocessore di movimento consuma meno dell'1% in 8 ore di funzionamento. Apple raccomanda di arrestare sempre gli aggiornamenti quando i dati non sono necessari.
Sì, CMPedometer fornisce una soluzione pronta per un podometro senza dover elaborare i dati grezzi dell'accelerometro. La classe riconosce automaticamente i passi con una precisione di circa il 95% durante la camminata e del 90% durante la corsa. Per un rilevatore di passi personalizzato, puoi usare CMMotionManager con il tuo algoritmo.
Core Motion è integrato in iOS a livello di sistema e utilizza il coprocessore della serie M per l'elaborazione a basso consumo energetico. Android utilizza SensorManager con accesso diretto ai driver hardware ma non dispone di un coprocessore specializzato, aumentando il consumo energetico durante il tracciamento in background.
Per CMPedometer su iOS 11 e successivi, è richiesta l'autorizzazione dell'utente. La richiesta viene effettuata automaticamente alla creazione di un CMPedometer e visualizza un dialogo di sistema. In Info.plist, è necessario aggiungere la chiave NSMotionUsageDescription con una descrizione del motivo per cui l'app necessita dell'accesso ai dati di movimento.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche