iosswiftiphoneios17haptic-feedback

CHHapticEngine not generating haptic feedback nor throws error?


I am trying to generate haptic feedback in an iOS application. I am doing so by using CoreHaptics.

My code to do this is as follows:

do {
        let engine = try CHHapticEngine()
        try engine.start()
        
        let hapticPattern = try CHHapticPattern(events: [
            CHHapticEvent(eventType: .hapticTransient, parameters: [
                CHHapticEventParameter(parameterID: .hapticSharpness, value: 1.0),
                CHHapticEventParameter(parameterID: .hapticIntensity, value: 1.0)
            ], relativeTime: CHHapticTimeImmediate)
        ], parameters: [])
        
       let player = try engine.makePlayer(with: hapticPattern)
       try player.start(atTime: 0)
    }
    catch {
        print("Error starting engine: \(error)")
    }

However running this code both directly in the viewDidLoad() method and an @IBAction with a UIButton to trigger it, does not result in any haptics playing.

The code doesn't throw any error either. Not in the catch statement or anywhere else.

I'm testing this on an iPhone 15 Pro. Both with silent mode on and off.

What am I doing wrong here?


Solution

  • The problem is that your engine and player are local variables so they go out of existence when the surrounding function finishes — which is before the haptic even has a chance to play. Lift them up so that each is a property of the surrounding view controller and thus gains long life.