Фреймворк 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 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также