我正在使用Core Haptics播放自定义的“心跳”模式,同时使用 AVAudioPlayer 播放音乐。具体来说,我正在创建一个简单的CHHapticPattern
,然后创建一个CHHapticEngine
来播放该模式。
自定义触觉在运行 iOS 14 的 iPhone 上运行良好,但在 iOS 15.0+ 中完全停止工作。触觉引擎在 iOS 15 中不会抛出任何错误,它只是默默地失败。标准的触觉反馈,例如UIImpactFeedbackGenerator
工作正常;这只是失败的自定义触觉。
经过大量调试并没有发现 Core Haptics 突然停止工作的明显原因,我最终发现罪魁祸首是我的AVAudioSession
配置如下:
// Setup AVAudioSession
do {
try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [.duckOthers]) // <-- This conflicts with Core Haptics on iOS 15, but not iOS 14
try AVAudioSession.sharedInstance().setActive(true)
} catch {
print("Error activating AVAudioSession: \(error)")
}
如果我删除该.duckOthers
选项(例如,替换为.mixWithOthers
),则自定义触觉模式会在 iOS 15(和 14)中成功播放。
虽然我可以接受 using.mixWithOthers
而不是.duckOthers
,但我看不出任何明显的理由为什么.duckOthers
应该与 Core Haptics 冲突,并且突然开始仅在 iOS 15.0+ 中与它发生冲突。任何想法为什么?否则,我将向 Apple 提交错误报告。
这是一个演示该问题的精简演示项目的链接。如果您在支持触觉的 iPhone(iPhone 8 或更高版本)上的 iOS 15 上运行它,自定义触觉模式不会播放,但它在 iOS 14 上可以正常播放: link to project