Framework-ul Core Motion — o componentă de sistem iOS care oferă acces la datele acceleratorului, giroscopului, magnetometrului și pedometrului pe dispozitivele Apple. Potrivit Apple Developer Documentation, 2025, framework-ul procesează datele brute ale senzorilor și le transformă în metrici ușor de înțeles — accelerație, viteză unghiulară, orientare și număr de pași. API unic pentru toți senzorii de mișcare le permite dezvoltatorilor să creeze pedometre, aplicații de fitness și jocuri controlate prin înclinarea dispozitivului.
Puncte cheie
Core Motion — framework-ul de sistem Apple, introdus în iOS 4 pentru lucrul cu senzorii de mișcare ai dispozitivului. Oferă o interfață unificată pentru accesul la accelerator, giroscop, magnetometru și pedometru, scutind dezvoltatorul de necesitatea de a lucra cu drivere hardware la nivel scăzut.
Avantajul cheie al Core Motion este filtrarea hardware a datelor. Framework-ul combină automat citirile acceleratorului și giroscopului pentru a calcula userAcceleration pură fără componenta gravitațională și, de asemenea, oferă orientarea dispozitivului în spațiu sub formă de cuaternioni și unghiuri Euler.
Potrivit Apple WWDC 2023, Core Motion este utilizat în peste 80% din aplicațiile de fitness din App Store. Framework-ul este optimizat pentru consumul de energie — frecvența de interogare a senzorilor scade automat în absența abonaților, prelungind durata de viață a bateriei dispozitivului.
O caracteristică arhitecturală importantă — utilizarea coprocesorului din seria M (Motion coprocessor), care procesează datele senzorilor de mișcare independent de procesorul principal din seria A. Începând cu cipul M7 (iPhone 5S), coprocesorul colectează constant datele acceleratorului și giroscopului, permițând CMPedometer și CMAltimeter să funcționeze în fundal cu ecranul blocat cu un consum de energie mai mic de 1 mW. Acest lucru a devenit posibil datorită izolării hardware: coprocesorul are propria memorie nevolatilă și magistrală de date, independentă de sistemul principal.
Arhitectura Core Motion este construită pe modelul singleton prin CMMotionManager. Aplicația primește o singură instanță a managerului și prin intermediul acestuia configurează frecvența de actualizare, pornește sau oprește colectarea datelor de la fiecare tip de senzor. Datele sunt livrate prin blocuri cu intervalul specificat.
Framework-ul folosește două moduri de obținere a datelor: pull (interogare activă prin startAccelerometerUpdates) și push (primire pasivă prin startAccelerometerUpdatesToQueue). Modul push este preferat pentru aplicațiile UI, deoarece datele sunt livrate în coada specificată fără a bloca firul principal.
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 oferă acces la patru categorii de senzori: acceleratorul măsoară accelerația liniară pe trei axe, giroscopul — viteza unghiulară de rotație, magnetometrul — intensitatea câmpului magnetic pentru busolă. A patra categorie — datele combinate CMDeviceMotion, care includ citirile filtrate ale tuturor senzorilor.
CMDeviceMotion — cea mai valoroasă clasă pentru dezvoltare. Oferă userAcceleration (accelerație fără gravitație), rotationRate (viteză de rotație), magneticField (vectorul câmpului magnetic) și attitude (orientarea dispozitivului sub formă de cuaternion sau unghiuri Euler). Pentru calcularea attitude, Core Motion utilizează fuziunea datelor giroscopului și acceleratorului printr-un algoritm similar filtrului complementar.
Magnetometrul este utilizat pentru corectarea derivei giroscopului. Giroscopul pur acumulează erori în timp din cauza derivei termice și a zgomotului — magnetometrul și acceleratorul corectează această eroare, asigurând o precizie a orientării de până la 1–2 grade în poziție statică.
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 — clasa pentru numărarea pașilor, distanței parcurse și tempoului de mișcare. Utilizează datele acceleratorului cu procesare hardware pe coprocesorul de mișcare din seria M (M7/M8/M9/M10/M11). Aceasta permite funcționarea în fundal cu un consum minim de energie — aproximativ 1% baterie pentru 8 ore de urmărire continuă.
CMAltimeter — clasa pentru determinarea altitudinii relative pe baza barometrului instalat în iPhone 6 și mai nou. Afișează schimbarea altitudinii față de punctul de plecare cu o precizie de aproximativ 1 metru. Utilizat în aplicațiile de fitness pentru numărarea etajelor și în aplicațiile de navigație pentru determinarea diferențelor de altitudine.
Datele CMPedometer sunt disponibile cu o întârziere de cel mult 5 secunde pentru citirile curente. Pentru datele istorice, este disponibilă selecția din ultimele 7 zile prin queryPedometerData. Pedometrul recunoaște automat mersul, alergatul și condusul — aceste tipuri de activitate sunt disponibile prin queryPedometerData cu filtru după tip.
Precizia CMPedometer este de aproximativ 95% la mersul normal și scade la 90% la alergare. Precizia este influențată de: amplasarea telefonului în buzunar sau rucsac, tipul de încălțăminte și suprafață. Apple recomandă utilizarea CMPedometer în combinație cu Core Location pentru determinarea distanței în aer liber — GPS oferă o distanță mai precisă, iar Core Motion — numărarea pașilor.
let pedometer = CMPedometer()
guard CMPedometer
.isStepCountingAvailable() else { return }
pedometer.startUpdates(from: Date()) { data, _ in
guard let pedData = pedometerData else { return }
print("Pași: \(pedData.numberOfSteps)")
print("Distanță: \(pedData.distance)")
}
// Acces la altimetru
let altimeter = CMAltimeter()
altimeter.startRelativeAltitudeUpdates(
to: OperationQueue.current()!
) { data, _ in
print("Altitudine: \(data?.relativeAltitude)")
}
Integrarea Core Motion nu necesită permisiuni speciale sau entitlement — este suficient să adăugați importul framework-ului și să creați o instanță CMMotionManager. Cu toate acestea, pentru CMPedometer începând cu iOS 11 este necesară solicitarea de autorizare prin CMStepCounter sau utilizarea CMPedometer cu solicitarea permisiunii printr-un dialog de sistem.
Procesul de integrare include: crearea CMMotionManager, verificarea disponibilității senzorului prin isAccelerometerAvailable / isGyroAvailable / isDeviceMotionAvailable, setarea intervalului de actualizare și pornirea primirii datelor. Este important să opriți actualizările prin stopAccelerometerUpdates atunci când datele nu sunt necesare — acest lucru este critic pentru consumul de energie.
Pentru funcționarea în fundal, CMPedometer și CMAltimeter nu necesită setări suplimentare — ele utilizează coprocesorul de mișcare. Pentru CMMotionManager, funcționarea în fundal nu este disponibilă — datele sunt colectate doar când aplicația este activă și se află în prim-plan. Singura condiție pentru CMPedometer — aplicația trebuie să fi fost lansată cel puțin o dată de utilizator după instalare pentru inițializarea abonamentului la actualizări în fundal din iOS.
Core Motion suportă frecvența adaptivă de interogare: dacă aplicația nu are nevoie de date în timp real, este suficient să setați un interval de 1–5 Hz în loc de 100 Hz. Pentru aplicațiile de fitness, frecvența optimă este de 10 Hz pentru CMMotionManager și 1 Hz pentru CMPedometer. Apple recomandă reducerea frecvenței la minimul necesar pentru funcționarea corectă.
Pentru jocurile controlate prin înclinare, este necesară o frecvență de 60–100 Hz pentru a asigura netezimea reacției. În acest caz, este important să utilizați startDeviceMotionUpdates cu o coadă separată și să procesați datele cât mai rapid posibil. Potrivit Apple, frecvența de 60 Hz consumă de aproximativ 2 ori mai multă energie decât 30 Hz.
Când lucrați cu Core Motion, trebuie să luați în considerare compatibilitatea dispozitivelor: giroscopul lipsește pe iPhone 3GS și iPad de generația 1, magnetometrul — pe toate iPad-urile fără modul celular. Pentru verificarea disponibilității senzorilor se utilizează metodele statice isAccelerometerAvailable, isGyroAvailable și isDeviceMotionAvailable ale clasei CMMotionManager. În simulator, Core Motion returnează date de test — pentru depanarea pe un senzor real este întotdeauna necesar un dispozitiv fizic Apple.
// Configurare optimă pentru aplicația de 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()
}
}
Întrebări frecvente
Da, Core Motion funcționează pe toate dispozitivele Apple cu senzorii necesari. Acceleratorul este prezent pe toate iPhone, iPad și iPod touch. Giroscopul — pe toate iPhone 4 și mai noi, iPad 2 și mai noi. Magnetometrul — doar pe iPhone, pe iPad lipsește. Barometrul — pe iPhone 6 și mai noi.
Impactul asupra bateriei depinde de frecvența de interogare. La 100 Hz, Core Motion consumă aproximativ 5–7% baterie pe oră. La 10 Hz — aproximativ 1–2% pe oră. CMPedometer pe coprocesorul de mișcare consumă mai puțin de 1% în 8 ore de funcționare. Apple recomandă să opriți întotdeauna actualizările când datele nu sunt necesare.
Da, CMPedometer oferă o soluție gata făcută pentru pedometru, fără a fi nevoie să procesați datele brute ale acceleratorului. Clasa recunoaște automat pașii cu o precizie de aproximativ 95% la mers și 90% la alergare. Pentru un detector de pași personalizat, puteți utiliza CMMotionManager cu propriul algoritm.
Core Motion este integrat în iOS la nivel de sistem și utilizează coprocesorul din seria M pentru procesare cu consum redus de energie. Android utilizează SensorManager cu acces direct la driverele hardware, dar nu are un coprocesor specializat, ceea ce crește consumul de energie la urmărirea în fundal.
Pentru CMPedometer în iOS 11 și mai nou, este necesară permisiunea utilizatorului. Solicitarea se face automat la crearea CMPedometer și afișează un dialog de sistem. În Info.plist trebuie adăugată cheia NSMotionUsageDescription cu o descriere a motivului pentru care aplicația are nevoie de acces la datele de mișcare.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și