Framework-ът Core Motion — системен компонент на iOS, предоставящ достъп до данни от акселерометър, жироскоп, магнитометър и крачкомер на устройства на Apple. Според Apple Developer Documentation, 2025, framework-ът обработва суровите данни от сензорите и ги преобразува в разбираеми метрики — ускорение, ъглова скорост, ориентация и брой стъпки. Единен API за всички сензори за движение позволява на разработчиците да създават крачкомери, фитнес приложения и игри с управление чрез накланяне на устройството.
Основни точки
Core Motion — системен framework на Apple, представен в iOS 4 за работа със сензорите за движение на устройството. Той предоставя единен интерфейс за достъп до акселерометър, жироскоп, магнитометър и крачкомер, освобождавайки разработчика от необходимостта да работи с хардуерни драйвери на ниско ниво.
Ключовото предимство на Core Motion е хардуерното филтриране на данни. Framework-ът автоматично комбинира показанията на акселерометъра и жироскопа за изчисляване на чист userAcceleration без гравитационен компонент, както и предоставя ориентацията на устройството в пространството под формата на кватерниони и ъгли на Ойлер.
Според Apple WWDC 2023, Core Motion се използва в над 80% от фитнес приложенията в App Store. Framework-ът е оптимизиран за консумация на енергия — честотата на запитване на сензорите автоматично намалява при липса на абонати, удължавайки времето за работа на устройството с батерия.
Важна архитектурна особеност — използването на копроцесор от M-серията (Motion coprocessor), който обработва данни от сензорите за движение независимо от основния процесор от A-серията. Започвайки от чипа M7 (iPhone 5S), копроцесорът непрекъснато събира данни от акселерометъра и жироскопа, позволявайки на CMPedometer и CMAltimeter да работят на заден план с заключен екран с консумация на енергия под 1 mW. Това стана възможно благодарение на хардуерната изолация: копроцесорът има собствена енергонезависима памет и шина за данни, независима от основната система.
Архитектурата на Core Motion е изградена по сингълтън модел чрез CMMotionManager. Приложението получава единствена инстанция на мениджъра и чрез нея конфигурира честотата на обновяване, стартира или спира събирането на данни от всеки тип сензор. Данните се доставят чрез блокове с определен интервал.
Framework-ът използва два режима на получаване на данни: 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 на framework-а и да създадете инстанция на 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 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също