Core Motionフレームワークは、Appleデバイス上の加速度計、ジャイロスコープ、磁力計、歩数計のデータへのアクセスを提供するiOSのシステムコンポーネントです。Apple Developer Documentation, 2025によると、フレームワークはセンサーの生データを処理し、加速度、角速度、向き、歩数という理解しやすいメトリクスに変換します。すべてのモーションセンサー向けの単一APIにより、開発者は歩数計、フィットネスアプリ、デバイスの傾き制御を使用したゲームを作成できます。
重要ポイント
Core Motionは、デバイスのモーションセンサーを扱うためにiOS 4で導入されたAppleのシステムフレームワークです。加速度計、ジャイロスコープ、磁力計、歩数計にアクセスするための統一インターフェースを提供し、開発者は低レベルでハードウェアドライバーを扱う必要がありません。
Core Motionの主な利点は、データのハードウェアフィルタリングです。フレームワークは自動的に加速度計とジャイロスコープの読み取り値を組み合わせて、重力成分を含まない純粋なuserAccelerationを計算し、クォータニオンやオイラー角の形式でデバイスの空間的な向きも提供します。
Apple WWDC 2023によると、Core MotionはApp Storeの80%以上のフィットネスアプリで使用されています。フレームワークは電力消費に最適化されており、サブスクライバーがいない場合、センサーのポーリング頻度が自動的に低下し、デバイスのバッテリー寿命を延ばします。
重要なアーキテクチャ上の特徴は、Mシリーズコプロセッサ(Motion coprocessor)の使用です。これはメインのAシリーズプロセッサから独立してモーションセンサーデータを処理します。M7チップ(iPhone 5S)以降、コプロセッサは継続的に加速度計とジャイロスコープのデータを収集し、CMPedometerとCMAltimeterが1mW未満の消費電力で画面ロック時のバックグラウンドでも動作できるようにしています。これはハードウェアの分離により可能になりました。コプロセッサは独自の不揮発性メモリとメインシステムから独立したデータバスを持っています。
Core Motionのアーキテクチャは、CMMotionManagerを介したシングルトンモデルに基づいています。アプリケーションはマネージャーの単一インスタンスを取得し、それを介して更新頻度を設定し、各センサータイプのデータ収集を開始または停止します。データは指定された間隔でクロージャブロックを介して届きます。
フレームワークはデータ取得に2つのモードを使用します:プル(startAccelerometerUpdatesによるアクティブポーリング)とプッシュ(startAccelerometerUpdatesToQueueによるパッシブ受信)。プッシュモードは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は4つのカテゴリのセンサーへのアクセスを提供します:加速度計は3軸の直線加速度を測定し、ジャイロスコープは角回転速度を測定し、磁力計はコンパス用の磁場強度を測定します。4番目のカテゴリは、すべてのセンサーからのフィルタリング済み読み取り値を含む統合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)でのハードウェア処理とともに加速度計データを使用します。これにより、最小限の電力消費でバックグラウンド動作が可能になり、連続8時間のトラッキングで約1%のバッテリー消費です。
CMAltimeter — iPhone 6以降に搭載されている気圧計に基づいて相対高度を測定するクラスです。約1メートルの精度で開始点に対する高度変化を示します。フィットネスアプリでの階数カウントや、ナビゲーションアプリでの標高変化の判定に使用されます。
CMPedometerデータは現在の読み取り値に対して5秒以内の遅延で利用可能です。過去のデータについては、queryPedometerDataを介して最大7日間のデータを取得できます。歩数計は自動的に歩行、走行、サイクリングを認識し、これらのアクティビティタイプはqueryPedometerDataでタイプによるフィルタリングとともに利用できます。
CMPedometerの精度は通常の歩行で約95%であり、走行時には90%に低下します。精度は、ポケットやバッグ内での電話の位置、靴の種類、路面の影響を受けます。Appleは屋外での距離測定にCore Locationと組み合わせてCMPedometerを使用することを推奨しています。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の統合には特別な権限やエンタイトルメントは必要ありません。フレームワークのインポートを追加し、CMMotionManagerのインスタンスを作成するだけです。ただし、iOS 11以降のCMPedometerでは、CMStepCounterを介した承認、またはシステム許可ダイアログ付きのCMPedometerの使用が必要です。
統合プロセスには以下が含まれます:CMMotionManagerの作成、isAccelerometerAvailable/isGyroAvailable/isDeviceMotionAvailableによるセンサーの可用性確認、更新間隔の設定、データ収集の開始。データが不要になったらstopAccelerometerUpdatesで更新を停止することが重要です。これは電力消費にとって極めて重要です。
バックグラウンド動作の場合、CMPedometerとCMAltimeterは追加設定を必要としません。これらはモーションコプロセッサを使用します。CMMotionManagerの場合、バックグラウンド動作は利用できません。データはアプリがアクティブでフォアグラウンドにある場合にのみ収集されます。CMPedometerの唯一の条件は、iOSからのバックグラウンド更新のサブスクリプションを初期化するために、インストール後にユーザーがアプリを少なくとも1回起動している必要があることです。
Core Motionは適応型ポーリング頻度をサポートしています。アプリがリアルタイムデータを必要としない場合、100Hzではなく1~5Hzの間隔を設定するだけで十分です。フィットネスアプリの場合、CMMotionManagerでは10Hz、CMPedometerでは1Hzが最適な頻度です。Appleは正しい動作に必要な最小限の頻度に減らすことを推奨しています。
傾き制御を使用するゲームの場合、スムーズな応答を確保するために60~100Hzの頻度が必要です。この場合、別のキューでstartDeviceMotionUpdatesを使用し、データを可能な限り迅速に処理することが重要です。Appleによると、60Hzは30Hzの約2倍の電力を消費します。
Core Motionを扱う際は、デバイスの互換性を考慮することが重要です。ジャイロスコープはiPhone 3GSおよび初代iPadにはなく、磁力計はセルラーモジュールのないすべてのiPadにはありません。センサーの可用性確認には、CMMotionManagerクラスの静的メソッドisAccelerometerAvailable、isGyroAvailable、isDeviceMotionAvailableを使用します。シミュレーターでは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以降で利用可能です。
バッテリーへの影響はポーリング頻度に依存します。100Hzでは、Core Motionは1時間あたり約5~7%のバッテリーを消費します。10Hzでは、1時間あたり約1~2%です。モーションコプロセッサ上のCMPedometerは8時間の動作で1%未満の消費です。Appleはデータが不要な場合は常に更新を停止することを推奨しています。
はい、CMPedometerは加速度計の生データを処理することなく歩数計のための既製のソリューションを提供します。このクラスは歩行時は約95%、走行時は90%の精度で自動的に歩数を認識します。カスタム歩数検出器の場合は、独自のアルゴリズムでCMMotionManagerを使用できます。
Core MotionはシステムレベルでiOSに統合されており、低エネルギー処理にMシリーズコプロセッサを使用します。Androidはハードウェアドライバーに直接アクセスするSensorManagerを使用しますが、専用のコプロセッサがないため、バックグラウンドトラッキング時の電力消費が増加します。
iOS 11以降のCMPedometerでは、ユーザーの許可が必要です。リクエストはCMPedometer作成時に自動的に行われ、システムダイアログが表示されます。Info.plistに、アプリがモーションデータへのアクセスを必要とする理由の説明を記載したNSMotionUsageDescriptionキーを追加する必要があります。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。