iPhone真机测试Core Haptics无触觉反馈,断点调试可触发如何解决
问题原因
你的代码存在两个核心时序和内存管理问题,刚好符合断点生效、正常运行失效的特征:
- 你在执行
try player.start(atTime: 0)之后立刻调用了hapticsEngine.stop(completionHandler: nil),正常运行时代码执行速度极快,触觉反馈还没完成播放引擎就被关停。断点调试时逐行执行的间隔刚好给了震动足够的播放时间,所以能触发效果。 - 你把
CHHapticPatternPlayer实例声明为了do代码块内的局部变量,代码执行完do块之后实例会被ARC自动释放,未完成的播放任务会被直接中断。
解决方案
- 把hapticsEngine和播放器实例声明为当前类的成员属性,避免被提前释放
- 不要在播放触发后立刻关停引擎,等播放完成后再执行stop操作,或者长期保留引擎运行状态减少启停开销
- 建议在引擎启动成功后再触发播放,避免时序异常
修正后参考代码
// 类层面声明成员属性,避免实例被提前释放 private var hapticsEngine: CHHapticEngine? private var currentHapticPlayer: CHHapticPatternPlayer? // 触发触觉反馈的逻辑 if supportHaptics, let engine = hapticsEngine { do { currentHapticPlayer = try engine.makePlayer(with: hapticPattern) try engine.start() try currentHapticPlayer?.start(atTime: CHHapticTimeImmediate) // 等待播放完成后再关停引擎,时长可根据你的触觉pattern实际长度调整 DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { [weak self] in self?.hapticsEngine?.stop() self?.currentHapticPlayer = nil } } catch { print(error) } }
内容的提问来源于stack exchange,提问作者Jack Stark
相关产品推荐
相关产品推荐

