CMMotionActivityManager无法识别Automotive活动,骑行误判为步行求助
iOS 运动检测问题:骑行被误识别为步行的解决建议
我们在应用中实现了运动检测功能,需识别Automotive(乘车)活动,编写的检测代码如下:
public func startMotionTracking() { var motion = MotionMode.unknown.rawValue; if CMMotionActivityManager.isActivityAvailable() { motionManager.startActivityUpdates(to: OperationQueue.main) { (activity) in guard let activity = activity else { return } if activity.walking { motion = MotionMode.walking.rawValue } else if activity.running { motion = MotionMode.running.rawValue } else if activity.cycling { motion = MotionMode.cycling.rawValue } else if activity.automotive { motion = MotionMode.automotive.rawValue } else if activity.stationary { motion = MotionMode.stationary.rawValue } else if activity.unknown { motion = MotionMode.unknown.rawValue } self.delegate?.currentMotionMode(currentMotion: motion) } } }
使用iPhone SE(第二代)、iOS 16.6版本测试时,骑行自行车却被识别为步行活动,而非Automotive活动,以下是具体解决建议:
调整活动判断优先级
当前代码中步行的判断优先级高于骑行和乘车,而CMMotionActivity在运动状态切换初期(比如骑行起步)可能同时触发多个活动标记。建议将automotive和cycling的判断移至walking之前,避免高优先级的步行状态覆盖正确的骑行/乘车识别:if activity.automotive { motion = MotionMode.automotive.rawValue } else if activity.cycling { motion = MotionMode.cycling.rawValue } else if activity.running { motion = MotionMode.running.rawValue } else if activity.walking { motion = MotionMode.walking.rawValue } else if activity.stationary { motion = MotionMode.stationary.rawValue } else if activity.unknown { motion = MotionMode.unknown.rawValue }增加置信度过滤
利用CMMotionActivity的confidence属性,仅当系统对活动识别的置信度为.high时才更新状态,减少低置信度下的误判:guard let activity = activity, activity.confidence == .high else { return }结合CoreLocation辅助判断
单纯依赖运动传感器可能存在精度局限,可结合CoreLocation获取当前移动速度,设置合理阈值(比如步行速度一般低于8km/h,骑行通常高于10km/h),当速度超过步行阈值时,优先判定为骑行或乘车状态。系统校准与场景测试
iOS 16.6针对iPhone SE(第二代)的运动识别可能存在适配细节问题,尝试重启设备后重新测试;同时选择较长距离的骑行场景,让系统有足够的运动数据完成状态校准,避免短距离起步时的误识别。
内容的提问来源于stack exchange,提问作者Siva
相关产品推荐
相关产品推荐

