Framework Core Motion to systemowy komponent iOS, zapewniający dostęp do danych akcelerometru, żyroskopu, magnetometru i krokomierza na urządzeniach Apple. Według Apple Developer Documentation, 2025, framework przetwarza surowe dane czujników i przekształca je w zrozumiałe metryki — przyspieszenie, prędkość kątową, orientację i liczbę kroków. Jeden API dla wszystkich czujników ruchu pozwala programistom tworzyć krokomierze, aplikacje fitness i gry z sterowaniem poprzez przechylanie urządzenia.
Najważniejsze
Core Motion — systemowy framework Apple, wprowadzony w iOS 4 do pracy z czujnikami ruchu urządzenia. Zapewnia jednolity interfejs dostępu do akcelerometru, żyroskopu, magnetometru i krokomierza, oszczędzając programiście konieczności pracy z sterownikami sprzętowymi na niskim poziomie.
Kluczową zaletą Core Motion jest sprzętowa filtracja danych. Framework automatycznie łączy odczyty akcelerometru i żyroskopu w celu obliczenia czystego userAcceleration bez składowej grawitacyjnej, a także podaje orientację urządzenia w przestrzeni w postaci kwaternionów i kątów Eulera.
Według Apple WWDC 2023, Core Motion jest używany w ponad 80% aplikacji fitness w App Store. Framework jest zoptymalizowany pod kątem zużycia energii — częstotliwość odpytywania czujników automatycznie spada przy braku subskrybentów, wydłużając czas pracy urządzenia na baterii.
Ważną cechą architektoniczną jest wykorzystanie koprocesora serii M (Motion coprocessor), który przetwarza dane czujników ruchu niezależnie od głównego procesora serii A. Począwszy od chipa M7 (iPhone 5S), koprocesor stale zbiera dane akcelerometru i żyroskopu, umożliwiając CMPedometer i CMAltimeter pracę w tle przy zablokowanym ekranie z poborem mocy poniżej 1 mW. Stało się to możliwe dzięki izolacji sprzętowej: koprocesor posiada własną nieulotną pamięć i magistralę danych, niezależną od głównego systemu.
Architektura Core Motion zbudowana jest według modelu singleton poprzez CMMotionManager. Aplikacja otrzymuje pojedynczą instancję menedżera i za jego pomocą konfiguruje częstotliwość aktualizacji, uruchamia lub zatrzymuje zbieranie danych z każdego typu czujnika. Dane są dostarczane przez bloki z określonym interwałem.
Framework wykorzystuje dwa tryby pozyskiwania danych: pull (aktywne odpytywanie przez startAccelerometerUpdates) i push (pasywne otrzymywanie przez startAccelerometerUpdatesToQueue). Tryb push jest preferowany dla aplikacji UI, ponieważ dane są dostarczane do określonej kolejki bez blokowania głównego wątku.
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 zapewnia dostęp do czterech kategorii czujników: akcelerometr mierzy liniowe przyspieszenie w trzech osiach, żyroskop — prędkość kątową obrotu, magnetometr — natężenie pola magnetycznego dla kompasu. Czwarta kategoria — połączone dane CMDeviceMotion, które obejmują filtrowane odczyty wszystkich czujników.
CMDeviceMotion — najcenniejsza klasa do programowania. Dostarcza userAcceleration (przyspieszenie bez grawitacji), rotationRate (prędkość obrotu), magneticField (wektor pola magnetycznego) i attitude (orientacja urządzenia w postaci kwaternionu lub kątów Eulera). Do obliczania attitude Core Motion wykorzystuje fuzję danych żyroskopu i akcelerometru według algorytmu podobnego do filtra komplementarnego.
Magnetometr służy do korekcji dryfu żyroskopu. Czysty żyroskop z czasem gromadzi błąd z powodu dryfu temperaturowego i szumu — magnetometr i akcelerometr korygują ten błąd, zapewniając dokładność orientacji do 1–2 stopni w pozycji statycznej.
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 — klasa do liczenia kroków, przebytego dystansu i tempa ruchu. Wykorzystuje dane akcelerometru z sprzętowym przetwarzaniem na koprocesorze ruchu serii M (M7/M8/M9/M10/M11). Umożliwia to pracę w tle z minimalnym zużyciem energii — około 1% baterii na 8 godzin ciągłego śledzenia.
CMAltimeter — klasa do określania względnej wysokości na podstawie barometru, zainstalowanego w iPhone 6 i nowszych. Pokazuje zmianę wysokości względem punktu początkowego z dokładnością około 1 metra. Używany w aplikacjach fitness do liczenia pięter i w nawigacyjnych do określania różnic wysokości.
Dane CMPedometer są dostępne z opóźnieniem nie większym niż 5 sekund dla bieżących odczytów. Dla danych historycznych dostępny jest wybór z ostatnich 7 dni przez queryPedometerData. Krokomierz automatycznie rozpoznaje chodzenie, bieganie i jazdę — te typy aktywności są dostępne przez queryPedometerData z filtrem według typu.
Dokładność CMPedometer wynosi około 95% przy normalnym chodzeniu i spada do 90% przy bieganiu. Na dokładność wpływają: umieszczenie telefonu w kieszeni lub plecaku, rodzaj obuwia i nawierzchnia. Apple zaleca używanie CMPedometer w połączeniu z Core Location do określania dystansu na otwartym powietrzu — GPS zapewnia dokładniejszy dystans, a Core Motion — liczenie kroków.
let pedometer = CMPedometer()
guard CMPedometer
.isStepCountingAvailable() else { return }
pedometer.startUpdates(from: Date()) { data, _ in
guard let pedData = pedometerData else { return }
print("Kroki: \(pedData.numberOfSteps)")
print("Dystans: \(pedData.distance)")
}
// Dostęp do altimetru
let altimeter = CMAltimeter()
altimeter.startRelativeAltitudeUpdates(
to: OperationQueue.current()!
) { data, _ in
print("Wysokość: \(data?.relativeAltitude)")
}
Integracja Core Motion nie wymaga specjalnych uprawnień ani entitlement — wystarczy dodać import frameworka i utworzyć instancję CMMotionManager. Jednak dla CMPedometer od iOS 11 wymagane jest żądanie autoryzacji przez CMStepCounter lub użycie CMPedometer z żądaniem zgody przez systemowe okno dialogowe.
Proces integracji obejmuje: utworzenie CMMotionManager, sprawdzenie dostępności czujnika przez isAccelerometerAvailable / isGyroAvailable / isDeviceMotionAvailable, ustawienie interwału aktualizacji i uruchomienie pobierania danych. Ważne jest zatrzymywanie aktualizacji przez stopAccelerometerUpdates, gdy dane nie są potrzebne — ma to krytyczne znaczenie dla zużycia energii.
Do pracy w tle krokomierza CMPedometer i altimetru CMAltimeter nie wymagają dodatkowych ustawień — wykorzystują koprocesor ruchu. Dla CMMotionManager praca w tle jest niedostępna — dane są zbierane tylko gdy aplikacja jest aktywna i znajduje się na pierwszym planie. Jedynym warunkiem dla CMPedometer jest to, że aplikacja musi być przynajmniej raz uruchomiona przez użytkownika po instalacji w celu inicjalizacji subskrypcji aktualizacji w tle z iOS.
Core Motion obsługuje adaptacyjną częstotliwość odpytywania: jeśli aplikacja nie potrzebuje danych w czasie rzeczywistym, wystarczy ustawić interwał 1–5 Hz zamiast 100 Hz. Dla aplikacji fitness optymalna częstotliwość to 10 Hz dla CMMotionManager i 1 Hz dla CMPedometer. Apple zaleca obniżanie częstotliwości do minimalnie wymaganej dla poprawnego działania.
Dla gier z sterowaniem poprzez przechylanie wymagana jest częstotliwość 60–100 Hz, aby zapewnić płynność reakcji. W tym przypadku ważne jest użycie startDeviceMotionUpdates z oddzielną kolejką i jak najszybsze przetwarzanie danych. Według Apple, częstotliwość 60 Hz zużywa około 2 razy więcej energii niż 30 Hz.
Podczas pracy z Core Motion należy uwzględnić kompatybilność urządzeń: żyroskop jest nieobecny w iPhone 3GS i iPad 1. generacji, magnetometr — we wszystkich iPad bez modułu komórkowego. Do sprawdzenia dostępności czujników służą statyczne metody isAccelerometerAvailable, isGyroAvailable i isDeviceMotionAvailable klasy CMMotionManager. W symulatorze Core Motion zwraca dane testowe — do debugowania na rzeczywistym czujniku zawsze potrzebne jest fizyczne urządzenie Apple.
// Optymalna konfiguracja dla aplikacji 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()
}
}
Często zadawane pytania
Tak, Core Motion działa na wszystkich urządzeniach Apple z niezbędnymi czujnikami. Akcelerometr jest we wszystkich iPhone, iPad i iPod touch. Żyroskop — we wszystkich iPhone 4 i nowszych, iPad 2 i nowszych. Magnetometr — tylko w iPhone, w iPad brak. Barometr — w iPhone 6 i nowszych.
Wpływ na baterię zależy od częstotliwości odpytywania. Przy 100 Hz Core Motion zużywa około 5–7% baterii na godzinę. Przy 10 Hz — około 1–2% na godzinę. CMPedometer na koprocesorze ruchu zużywa mniej niż 1% przez 8 godzin pracy. Apple zaleca zawsze zatrzymywać aktualizacje, gdy dane nie są potrzebne.
Tak, CMPedometer dostarcza gotowe rozwiązanie dla krokomierza bez konieczności przetwarzania surowych danych akcelerometru. Klasa automatycznie rozpoznaje kroki z dokładnością około 95% przy chodzeniu i 90% przy bieganiu. Do niestandardowego detektora kroków można użyć CMMotionManager z własnym algorytmem.
Core Motion jest zintegrowany z iOS na poziomie systemu i wykorzystuje koprocesor serii M do niskoenergetycznego przetwarzania. Android używa SensorManager z bezpośrednim dostępem do sterowników sprzętowych, ale nie posiada wyspecjalizowanego koprocesora, co zwiększa zużycie energii przy śledzeniu w tle.
Dla CMPedometer w iOS 11 i nowszych wymagana jest zgoda użytkownika. Żądanie jest wykonywane automatycznie przy utworzeniu CMPedometer i wywołuje systemowe okno dialogowe. W Info.plist należy dodać klucz NSMotionUsageDescription z opisem, dlaczego aplikacja potrzebuje dostępu do danych ruchu.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również