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

iPhone真机测试Core Haptics无触觉反馈,断点调试可触发如何解决

问题原因

你的代码存在两个核心时序和内存管理问题,刚好符合断点生效、正常运行失效的特征:

  1. 你在执行try player.start(atTime: 0)之后立刻调用了hapticsEngine.stop(completionHandler: nil),正常运行时代码执行速度极快,触觉反馈还没完成播放引擎就被关停。断点调试时逐行执行的间隔刚好给了震动足够的播放时间,所以能触发效果。
  2. 你把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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 21:57:03