You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

watchOS 10中CMBatchedSensorManager调用更新接口崩溃及报错问题

解决CMBatchedSensorManager崩溃及CMErrorDomain 109错误

问题复盘

  • 使用Xcode 15调用CMBatchedSensorManager的startDeviceMotionUpdates/startAccelerometerUpdates接口,初期无报错但在com.apple.tcc.kTCCServiceMotion线程崩溃
  • 添加HealthKit权限后问题未解决
  • 补充Privacy - Motion Usage Description到info.plist后崩溃消失,但出现错误:操作无法完成。(CMErrorDomain 错误 109。)

解决步骤

  1. 修正权限逻辑
    崩溃和错误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权限")
              }
          }
      }
      
  2. 规范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 ?? "无数据")")
          }
      }
      
  3. 优化权限申请时机
    不要在App启动时直接申请权限,建议在用户触发相关功能(比如点击“开始监测”按钮)时再发起请求,提升用户授权意愿。


内容的提问来源于stack exchange,提问作者Siamaster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 16:34:27