0

I'm using Core Haptics to play a custom "heart beat" pattern, while simultaneously playing music using AVAudioPlayer. Specifically, I'm creating a simple CHHapticPattern, then creating a CHHapticEngine to play that pattern.

The custom haptics play just fine on an iPhone running iOS 14, but completely stopped working in iOS 15.0+. The haptic engine doesn't throw any errors in iOS 15, it just fails silently. Standard haptic feedback such as UIImpactFeedbackGenerator work just fine; it's just the custom haptics that fail.

After lots of debugging and seeing no obvious reasons why Core Haptics should suddenly stop working, I eventually discovered the culprit is that I have an AVAudioSession configured as follows:

     // 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)")
        }

If I remove the .duckOthers option (e.g., replace with .mixWithOthers), then the custom haptic pattern plays successfully in iOS 15 (and 14).

While I can live with using .mixWithOthers instead of .duckOthers, I can't see any obvious rationale why .duckOthers should conflict with Core Haptics, and suddenly start conflicting with it only in iOS 15.0+. Any ideas why? Otherwise I will file a bug report with Apple.

Here is a link to a stripped down, demo project demonstrating the issue. If you run it on iOS 15 on an iPhone that supports haptics (iPhone 8 or later), the custom haptic pattern doesn't play, but it plays just fine on iOS 14: link to project

1 Answers1

0

You can set up your CHHapticEngine and set the property of .playsHapticsOnly to yes to avoid conflicting with AVAudioSession.

Hzzz
  • 1