What's new in Core Motion
System & Services 进阶 20m

Core Motion 的新变化

What's new in Core Motion

2023年6月5日

在 Apple 官方观看视频

一句话判断

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