System & Services 进阶 20m
Core Motion 的新变化
What's new in Core Motion
2023年6月5日
一句话判断
CMHeadphoneMotionManager 来到了 macOS,Apple Watch Ultra 支持水深和水温传感器——Core Motion 的边界在扩展。
这场 Session 讲了什么
Core Motion 框架今年有三个重要更新。
首先是 CMHeadphoneMotionManager 扩展到 macOS 14。从 iOS 14 开始,这个 API 就允许你从支持空间音频的头部追踪耳机(如 AirPods Pro)流式传输设备运动数据到 iOS/iPadOS 设备。现在同样的功能在 Mac 上也可用了。你可以获取姿态(attitude)、用户加速度和旋转速率数据,以及传感器位置信息(左耳还是右耳)。
其次是 CMWaterSubmersionManager 的更新,支持 Apple Watch Ultra 的水深和水温监测。通过 delegate 接收深度、温度和浸没状态更新。适用于浮潜、游泳等水上活动场景。
最后是新的高速传感器数据流 API,允许以更高频率获取传感器数据。
值得深挖的点
耳机运动数据的连接管理值得注意。数据从远程设备流式传输,所以需要关注连接状态。通过 CMHeadphoneMotionManagerDelegate 监听连接/断开事件。如果开启了自动耳部检测,取出耳机会触发断开,放回耳朵触发重新连接。数据一次只从一个耳机传输——如果右耳被取出,左耳会接管数据流。
Apple Watch Ultra 的水浸没管理器使用内置气压计追踪深度和温度。需要添加 Shallow Depth and Pressure capability 并配置 Auto Launch 设置。
代码片段
// macOS 上使用耳机运动数据
class MotionManager: NSObject, CMHeadphoneMotionManagerDelegate {
let motionManager = CMHeadphoneMotionManager()
func startTracking() {
guard motionManager.isDeviceMotionAvailable else { return }
motionManager.delegate = self
motionManager.startDeviceMotionUpdates(to: .main) { data, error in
guard let data = data else { return }
// 获取姿态信息
let attitude = data.attitude
// 获取传感器位置(左/右耳机)
let location = data.sensorLocation
}
}
func headphoneMotionManagerDidConnect(_ manager: CMHeadphoneMotionManager) {
// 耳机已连接
}
func headphoneMotionManagerDidDisconnect(_ manager: CMHeadphoneMotionManager) {
// 耳机已断开
}
}
// Apple Watch Ultra 水浸没监测
class WaterManager: NSObject, CMWaterSubmersionManagerDelegate {
let submersionManager = CMWaterSubmersionManager()
func startMonitoring() {
submersionManager.delegate = self
}
func waterSubmersionManager(_ manager: CMWaterSubmersionManager,
didUpdate event: CMWaterSubmersionEvent) {
// 处理浸没事件
}
}
最佳实践
- 在 Info.plist 中添加 Motion Usage Description 请求运动数据权限
- 使用
isDeviceMotionAvailable检查数据是否可用 - 实现 delegate 处理耳机的连接/断开事件
- Apple Watch Ultra 水浸没功能需要添加对应的 capability
- 使用 reference attitude 计算相对姿态变化
还有什么值得关注
- 耳机运动数据适用于健身追踪、游戏、姿势监测等场景
- Apple Watch Ultra 的深度和温度数据适用于浮潜和游泳 app
- 高速传感器数据流 API 适用于需要精细运动数据的应用
WWDC 2023