Фреймворк 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 мВт. Це стало можливим завдяки апаратній ізоляції: співпроцесор має власну енергонезалежну пам'ять та шину даних, незалежну від основної системи.
Архітектура 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 Гц
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 — достатньо додати імпорт фреймворку та створити екземпляр CMMotionManager. Однак для CMPedometer починаючи з iOS 11 потрібен запит авторизації через CMStepCounter або використання CMPedometer із системним діалогом дозволу.
Процес інтеграції включає: створення CMMotionManager, перевірку доступності датчика через isAccelerometerAvailable / isGyroAvailable / isDeviceMotionAvailable, налаштування інтервалу оновлення та запуск отримання даних. Важливо зупиняти оновлення через stopAccelerometerUpdates, коли дані не потрібні — це критично важливо для енергоспоживання.
Для фонової роботи крокоміра CMPedometer та висотоміра CMAltimeter не потрібні додаткові налаштування — вони використовують співпроцесор руху. Для CMMotionManager фонова робота недоступна — дані збираються лише тоді, коли додаток активний і знаходиться на передньому плані. Єдина умова для CMPedometer — додаток має бути хоча б один раз запущений користувачем після встановлення для ініціалізації підписки на фонові оновлення від iOS.
Core Motion підтримує адаптивну частоту опитування: якщо додатку не потрібні дані в реальному часі, достатньо встановити інтервал 1–5 Гц замість 100 Гц. Для фітнес-програм оптимальна частота — 10 Гц для CMMotionManager та 1 Гц для CMPedometer. Apple рекомендує знижувати частоту до мінімально необхідної для коректної роботи.
Для ігор з керуванням нахилом необхідна частота 60–100 Гц, щоб забезпечити плавність реакції. У цьому випадку важливо використовувати startDeviceMotionUpdates з окремою чергою та обробляти дані максимально швидко. За даними Apple, частота 60 Гц споживає приблизно в 2 рази більше енергії, ніж 30 Гц.
При роботі з Core Motion важливо враховувати сумісність пристроїв: гіроскоп відсутній на iPhone 3GS та iPad 1-го покоління, магнітометр — на всіх iPad без стільникового модуля. Для перевірки доступності датчиків використовуються статичні методи isAccelerometerAvailable, isGyroAvailable та isDeviceMotionAvailable класу CMMotionManager. На симуляторі Core Motion повертає тестові дані — для налагодження на реальному датчику завжди необхідний фізичний пристрій Apple.
// Оптимальне налаштування для фітнес-додатку
motionManager.deviceMotionUpdateInterval = 0.1 // 10 Гц
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 Гц Core Motion споживає близько 5–7% заряду на годину. На 10 Гц — близько 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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також