watchOS 10中CMBatchedSensorManager调用更新接口崩溃及报错问题
解决CMBatchedSensorManager崩溃及CMErrorDomain 109错误
问题复盘
- 使用Xcode 15调用
CMBatchedSensorManager的startDeviceMotionUpdates/startAccelerometerUpdates接口,初期无报错但在com.apple.tcc.kTCCServiceMotion线程崩溃 - 添加HealthKit权限后问题未解决
- 补充
Privacy - Motion Usage Description到info.plist后崩溃消失,但出现错误:操作无法完成。(CMErrorDomain 错误 109。)
解决步骤
修正权限逻辑
崩溃和错误109的核心原因都是未正确获取Motion & Fitness权限,HealthKit权限并非CMBatchedSensorManager的必需项。- 确保info.plist中已添加
NSMotionUsageDescription(对应可视化编辑里的Privacy - Motion Usage Description),描述需明确说明使用运动数据的目的 - 调用更新接口前必须主动请求权限,示例代码:
import CoreMotion let activityManager = CMMotionActivityManager() func requestMotionPermission() { activityManager.requestAuthorization { granted in if granted { // 权限获取成功后再启动批量更新 self.startBatchUpdate() } else { print("用户拒绝了Motion权限") } } }
- 确保info.plist中已添加
规范
CMBatchedSensorManager使用- 需在主线程初始化
CMBatchedSensorManager,避免线程冲突 - 建议设置合理的
batchInterval(批量更新间隔),默认值可能导致数据回调不触发,示例:private let batchedMotion = CMBatchedSensorManager() func startBatchUpdate() { // 设置批量间隔为1秒 batchedMotion.batchInterval = 1.0 print("starting") batchedMotion.startDeviceMotionUpdates { data, error in if let error = error { print("错误:\(error.localizedDescription)") return } print("收到数据:\(data ?? "无数据")") } }
- 需在主线程初始化
优化权限申请时机
不要在App启动时直接申请权限,建议在用户触发相关功能(比如点击“开始监测”按钮)时再发起请求,提升用户授权意愿。
内容的提问来源于stack exchange,提问作者Siamaster
相关产品推荐
相关产品推荐

