CoreMotion 技能用于在 iOS 和 watchOS 上读取设备传感器数据,包括加速度计、陀螺仪、磁力计、计步器和活动识别。CoreMotion 将原始传感器输入融合为处理后的设备运动数据,并提供计步器与活动 API,面向健身和导航等使用场景。目标平台为 Swift 6.3 / iOS 26+。
一、用途 该技能适用于读取设备传感器数据、统计步数、识别用户活动状态(静止、步行、跑步、骑行、乘车)以及获取高度数据等场景。
二、主要能力
- CMMotionManager:读取加速度计、陀螺仪等原始传感器数据,支持回调更新与轮询两种模式。
- 处理后的设备运动(CMDeviceMotion):融合加速度计、陀螺仪和磁力计,提供姿态(roll、pitch、yaw)、去除重力的用户加速度、重力、旋转速率和校准后的磁场,并可选择姿态参考坐标系。
- CMPedometer:提供步数、距离、配速、步频和楼层数,支持历史查询与实时更新。
- CMMotionActivityManager:识别静止、步行、跑步、骑行、乘车等活动类型,支持实时更新与历史查询,并提供置信度。
- CMAltimeter:提供相对高度与气压数据,以及基于 GPS 的绝对高度数据。
三、使用方式
- 在 Info.plist 中添加 NSMotionUsageDescription,并提供面向用户的说明字符串;缺少该键时应用首次访问会崩溃。
- 计步与活动 API 使用 CMAuthorizationStatus 检查授权状态;传感器 API 不需要显式授权,但需要上述说明键。
- 每个应用只创建一个 CMMotionManager 实例,多个实例会降低传感器更新速率。
- 启动更新前检查传感器可用性(如 isAccelerometerAvailable、isGyroAvailable、isDeviceMotionAvailable)。
- 设置更新间隔,并在生命周期对应方法中停止更新。
- 设备运动可选择姿态参考坐标系,如 .xArbitraryZVertical、.xArbitraryCorrectedZVertical、.xMagneticNorthZVertical、.xTrueNorthZVertical,使用前可检查可用坐标系。
- 计步器与活动管理器提供可用性检查方法,如 isStepCountingAvailable、isDistanceAvailable、isFloorCountingAvailable、isPaceAvailable、isCadenceAvailable、isActivityAvailable。
四、适用场景 适用于需要读取设备运动传感器、统计步数与距离、识别用户活动状态、获取高度数据的 iOS 与 watchOS 应用,例如健身追踪、导航、游戏中的倾斜控制等。
五、限制与注意事项
- 更新频率越高,电量消耗越大;应使用满足需求的最低频率。CMMotionManager 单次采样上限为 100 Hz,更高频率需在 watchOS/iOS 17+ 使用 CMBatchedSensorManager。
- 不要创建多个 CMMotionManager 实例。
- 不要跳过传感器可用性检查,否则在缺少相应硬件的设备上可能崩溃。
- 不要忘记停止更新,否则会持续耗电。
- 不要使用不必要的高更新频率。
- CMMotionActivity 的多个属性可能同时为真,应结合 confidence 判断。
- 更新处理器应分派到合适的队列,避免阻塞主线程进行重处理。
- 应在更新处理器中检查错误参数。
- 姿态参考坐标系应根据实际需要选择,不要不必要地默认使用真北。
六、审查清单 包括:Info.plist 中存在 NSMotionUsageDescription 并有清晰说明;全应用共享单个 CMMotionManager 实例;启动更新前检查传感器可用性;计步/活动 API 前检查授权状态;更新间隔设为可接受的最低频率;所有 startUpdates 调用在生命周期对应方法中有匹配的 stopUpdates;处理器分派到合适队列;根据 confidence 判断活动类型;检查更新处理器中的错误参数;根据实际需要选择姿态参考坐标系。
七、参考 扩展模式(SwiftUI 集成、批量传感器管理器、耳机运动)见 references/motion-patterns.md,以及 CoreMotion 框架、CMMotionManager、CMPedometer、CMMotionActivityManager、CMDeviceMotion、CMAltimeter、CMBatchedSensorManager 等官方文档。