Core Motion框架 — 一个iOS系统组件,提供对Apple设备上加速度计、陀螺仪、磁力计和计步器数据的访问。根据 Apple Developer Documentation, 2025,该框架处理传感器的原始数据并将其转换为可理解的指标 — 加速度、角速度、方向和步数。所有运动传感器的统一API允许开发人员创建计步器、健身应用和通过设备倾斜控制的游戏。
要点
Core Motion — Apple的系统框架,在iOS 4中引入,用于处理设备的运动传感器。它提供统一的接口来访问加速度计、陀螺仪、磁力计和计步器,使开发人员无需在低层次上处理硬件驱动程序。
Core Motion的主要优势是硬件级过滤数据。该框架自动结合加速度计和陀螺仪的读数,计算不含重力分量的纯净userAcceleration,并以四元数和欧拉角的形式提供设备在空间中的方向。
根据Apple WWDC 2023的数据,Core Motion被用于App Store中超过80%的健身应用。该框架针对能耗进行了优化 — 在没有订阅者时,传感器的轮询频率会自动降低,从而延长设备的电池续航时间。
一个重要的架构特性是使用M系列协处理器(Motion协处理器),它独立于主A系列处理器处理运动传感器数据。从M7芯片(iPhone 5S)开始,协处理器持续收集加速度计和陀螺仪数据,使CMPedometer和CMAltimeter能够在锁定屏幕的情况下以低于1 mW的功耗在后台工作。这得益于硬件隔离:协处理器拥有自己的非易失性存储器和数据总线,独立于主系统。
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 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建议将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 Hz的间隔而不是100 Hz。对于健身应用,CMMotionManager的最佳频率为10 Hz,CMPedometer为1 Hz。Apple建议将频率降低到正确运行所需的最低水平。
对于通过倾斜控制的游戏,需要60–100 Hz的频率以确保响应流畅。在这种情况下,使用带有单独队列的startDeviceMotionUpdates并尽快处理数据非常重要。根据Apple的数据,60 Hz频率的能耗约为30 Hz的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及更新版本上。
对电池的影响取决于轮询频率。在100 Hz时,Core Motion每小时消耗约5–7%的电量。在10 Hz时 — 每小时约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应用程序。我们将为您提供咨询并提出最佳解决方案。