Оквир Core Motion — системска компонента iOS-а која пружа приступ подацима акцелерометра, жироскопа, магнетометра и педометра на Apple уређајима. Према Apple Developer Documentation, 2025, оквир обрађује сирове податке сензора и претвара их у разумљиве метрике — убрзање, угаону брзину, оријентацију и број корака. Јединствени API за све сензоре покрета омогућава програмерима да креирају педометре, фитнес апликације и игре са управљањем нагибом уређаја.
Главни закључци
Core Motion — Apple-ов системски оквир, представљен у iOS 4 за рад са сензорима покрета уређаја. Пружа јединствени интерфејс за приступ акцелерометру, жироскопу, магнетометру и педометру, ослобађајући програмера потребе за радом са хардверским драјверима на ниском нивоу.
Кључна предност Core Motion-а је хардверска филтрација података. Оквир аутоматски комбинује очитавања акцелерометра и жироскопа за израчунавање чистог userAcceleration без гравитационе компоненте, а такође даје оријентацију уређаја у простору у облику кватерниона и Ојлерових углова.
Према Apple WWDC 2023, Core Motion се користи у више од 80% фитнес апликација из App Store-а. Оквир је оптимизован за потрошњу енергије — учесталост испитивања сензора се аутоматски смањује у одсуству претплатника, продужавајући време рада уређаја на батерији.
Важна архитектонска карактеристика — употреба копроцесора M-серије (Motion coprocessor), који обрађује податке сензора покрета независно од главног процесора A-серије. Почевши од чипа M7 (iPhone 5S), копроцесор непрекидно прикупља податке акцелерометра и жироскопа, омогућавајући CMPedometer-у и CMAltimeter-у да раде у позадини са закључаним екраном уз потрошњу мању од 1 mW. Ово је постало могуће захваљујући хардверској изолацији: копроцесор има сопствену неиспарљиву меморију и магистралу података, независну од главног система.
Архитектура Core Motion-а изграђена је по синглтон моделу преко CMMotionManager-а. Апликација добија једну инстанцу менаџера и преко њега конфигурише учесталост ажурирања, покреће или зауставља прикупљање података са сваког типа сензора. Подаци се достављају путем блокова са одређеним интервалом.
Оквир користи два режима добијања података: pull (активно испитивање кроз startAccelerometerUpdates) и push (пасивно примање кроз startAccelerometerUpdatesToQueue). Push режим је пожељнији за UI апликације, јер се подаци достављају у одређени ред без блокирања главне нити.
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 пружа приступ четири категорије сензора: акцелерометар мери линеарно убрзање дуж три осе, жироскоп — угаону брзину ротације, магнетометар — јачину магнетног поља за компас. Четврта категорија — обједињени подаци CMDeviceMotion-а, који укључују филтрирана очитавања свих сензора.
CMDeviceMotion — највреднија класа за развој. Пружа userAcceleration (убрзање без гравитације), rotationRate (брзину ротације), magneticField (вектор магнетног поља) и attitude (оријентацију уређаја у облику кватерниона или Ојлерових углова). За израчунавање attitude, Core Motion користи фузију података жироскопа и акцелерометра по алгоритму сличном комплементарном филтеру.
Магнетометар се користи за корекцију дрифта жироскопа. Чисти жироскоп временом акумулира грешку због температурног дрифта и шума — магнетометар и акцелерометар исправљају ову грешку, обезбеђујући тачност оријентације до 1–2 степена у статичком положају.
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 — класа за бројање корака, пређеног растојања и темпа кретања. Користи податке акцелерометра са хардверском обрадом на копроцесору покрета M-серије (M7/M8/M9/M10/M11). Ово омогућава рад у позадини са минималном потрошњом енергије — око 1% батерије за 8 сати непрекидног праћења.
CMAltimeter — класа за одређивање релативне висине на основу барометра уграђеног у iPhone 6 и новије. Показује промену висине у односу на почетну тачку са тачношћу од око 1 метра. Користи се у фитнес апликацијама за бројање спратова и у навигационим апликацијама за одређивање висинских разлика.
Подаци CMPedometer-а су доступни са кашњењем не већим од 5 секунди за тренутна очитавања. За историјске податке доступан је избор из последњих 7 дана путем queryPedometerData. Педометар аутоматски препознаје ходање, трчање и вожњу — ови типови активности доступни су путем queryPedometerData са филтером по типу.
Тачност CMPedometer-а износи око 95% при нормалном ходању и смањује се на 90% при трчању. На тачност утичу: положај телефона у џепу или ранцу, тип обуће и подлога. Apple препоручује коришћење CMPedometer-а у комбинацији са Core Location за одређивање удаљености на отвореном — GPS обезбеђује прецизнију удаљеност, а Core Motion — бројање корака.
let pedometer = CMPedometer()
guard CMPedometer
.isStepCountingAvailable() else { return }
pedometer.startUpdates(from: Date()) { data, _ in
guard let pedData = pedometerData else { return }
print("Кораци: \(pedData.numberOfSteps)")
print("Растојање: \(pedData.distance)")
}
// Приступ алтиметру
let altimeter = CMAltimeter()
altimeter.startRelativeAltitudeUpdates(
to: OperationQueue.current()!
) { data, _ in
print("Висина: \(data?.relativeAltitude)")
}
Интеграција Core Motion-а не захтева посебне дозволе или entitlement — довољно је додати import оквира и креирати инстанцу CMMotionManager-а. Међутим, за CMPedometer од iOS 11 потребан је захтев за ауторизацију путем CMStepCounter-а или коришћење CMPedometer-а са захтевом за дозволу кроз системски дијалог.
Процес интеграције укључује: креирање CMMotionManager-а, проверу доступности сензора путем isAccelerometerAvailable / isGyroAvailable / isDeviceMotionAvailable, подешавање интервала ажурирања и покретање пријема података. Важно је зауставити ажурирања путем stopAccelerometerUpdates када подаци нису потребни — ово је критично за потрошњу енергије.
За рад у позадини, CMPedometer и CMAltimeter не захтевају додатна подешавања — они користе копроцесор покрета. За CMMotionManager рад у позадини није доступан — подаци се прикупљају само када је апликација активна и налази се у предњем плану. Једини услов за CMPedometer — апликација мора бити покренута бар једном од стране корисника након инсталације ради иницијализације претплате на позадинска ажурирања из iOS-а.
Core Motion подржава адаптивну учесталост испитивања: ако апликацији нису потребни подаци у реалном времену, довољно је подесити интервал од 1–5 Hz уместо 100 Hz. За фитнес апликације оптимална учесталост је 10 Hz за CMMotionManager и 1 Hz за CMPedometer. Apple препоручује смањење учесталости на минимално потребну за исправан рад.
За игре са управљањем нагибом потребна је учесталост од 60–100 Hz како би се обезбедила глаткоћа реакције. У овом случају важно је користити startDeviceMotionUpdates са одвојеним редом и обрађивати податке што је брже могуће. Према Apple-у, учесталост од 60 Hz троши приближно 2 пута више енергије од 30 Hz.
При раду са Core Motion-ом потребно је узети у обзир компатибилност уређаја: жироскоп недостаје на iPhone 3GS и iPad-у 1. генерације, магнетометар — на свим iPad-овима без ћелијског модула. За проверу доступности сензора користе се статичке методе isAccelerometerAvailable, isGyroAvailable и isDeviceMotionAvailable класе CMMotionManager. У симулатору Core Motion враћа тест податке — за отклањање грешака на стварном сензору увек је потребан физички Apple уређај.
// Оптимално подешавање за фитнес апликацију
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()
}
}
Често постављана питања
Да, Core Motion ради на свим Apple уређајима са потребним сензорима. Акцелерометар постоји на свим iPhone, iPad и iPod touch уређајима. Жироскоп — на свим iPhone 4 и новијим, iPad 2 и новијим. Магнетометар — само на iPhone-у, на iPad-у недостаје. Барометар — на iPhone 6 и новијим.
Утицај на батерију зависи од учесталости испитивања. На 100 Hz Core Motion троши око 5–7% батерије на сат. На 10 Hz — око 1–2% на сат. CMPedometer на копроцесору покрета троши мање од 1% за 8 сати рада. Apple препоручује да увек заустављате ажурирања када подаци нису потребни.
Да, CMPedometer пружа готово решење за педометар без потребе за обрадом сирових података акцелерометра. Класа аутоматски препознаје кораке са тачношћу од око 95% при ходању и 90% при трчању. За прилагођени детектор корака може се користити CMMotionManager са сопственим алгоритмом.
Core Motion је интегрисан у iOS на нивоу система и користи копроцесор M-серије за нискоенергетску обраду. Android користи SensorManager са директним приступом хардверским драјверима, али нема специјализовани копроцесор, што повећава потрошњу енергије при позадинском праћењу.
За CMPedometer у iOS 11 и новијим потребна је дозвола корисника. Захтев се извршава аутоматски при креирању CMPedometer-а и приказује системски дијалог. У Info.plist је потребно додати кључ NSMotionUsageDescription са описом зашто апликацији треба приступ подацима о кретању.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође