Swift开发:CMMovementDisorderManager无结果输出问题求助
针对你遇到的queryDyskineticSymptom闭包未触发的问题,结合MovementDisorderManager的使用逻辑,常见原因和排查步骤如下:
监测未产生有效数据
monitorKinesias(forDuration:)是持续收集运动障碍数据的API,你设置的时长为7天,刚调用监测就立刻执行查询,此时系统还未收集到任何符合条件的症状数据,闭包自然不会有输出。
排查:先将监测时长改为1-2分钟,等待对应时长后再调用testFunc查询,看闭包是否触发。查询时间范围不匹配
如果你的queryDyskineticSymptom查询的是监测开始前的历史数据,或者时间范围未包含当前监测的时段,会导致查询结果为空,闭包内的计数等逻辑不会执行。
排查:确保查询的起始时间设置为监测启动的时间(可保存monitorKinesias调用时的Date()),结束时间设置为当前时间Date()。后台监测被系统终止
iOS对APP后台活动有严格限制,若未配置对应的后台模式,APP退到后台后,7天的监测任务会被系统强制终止,无法持续收集数据。
排查:在Info.plist中添加UIBackgroundModes键,包含health-update值;同时通过Xcode的Debug导航栏查看APP后台状态,确认监测任务未被清理。权限未完全配置
即使完成了基础权限配置,可能未申请到运动障碍数据的读取权限,或者monitorKinesias需要的特定权限未通过用户授权。
排查:调用HKHealthStore().authorizationStatus(for: HKObjectType.dyskineticSymptom()),确认授权状态为.sharingAuthorized;同时检查权限申请代码中是否包含了读取和写入运动障碍数据的请求。监测任务引用被释放
如果monitorKinesias返回的HKTask对象没有被强引用保存,该对象会被ARC自动释放,导致监测任务提前终止。
排查:在类中声明一个属性(如var kinesiaTask: HKTask?),将monitorKinesias的返回值赋值给该属性,确保任务对象在监测期间不会被释放。
内容的提问来源于stack exchange,提问作者Kiwi

