JasonAddFour
JasonAddFour

Reputation: 163

Haptic feedback not playing nice with AVFoundation? (UIImpactFeedbackGenerator, etc)

I'm trying to have a video/camera view in the background while I also allow for haptic feedback in my app for various actions, but it seems that AVFoundation is not playing nice with any of the calls I am making that involve the haptic calls:

if #available(iOS 10.0, *) {
    let generator = UIImpactFeedbackGenerator(style: .light)
    generator.prepare()
    generator.impactOccurred()
    
    // More:

    let feedbackGenerator  = UISelectionFeedbackGenerator()
    feedbackGenerator.selectionChanged()
}

Haptic feedback works great and as expected as long as the AVFoundation stuff is commented out. Any ideas?

Using:

captureSession = AVCaptureSession()

AND:

previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)

Upvotes: 6

Views: 2332

Answers (2)

Vukašin Manojlović
Vukašin Manojlović

Reputation: 3857

Since iOS 13, you can set setAllowHapticsAndSystemSoundsDuringRecording(_:) for AVAudioSession:

do {
    try AVAudioSession.sharedInstance().setAllowHapticsAndSystemSoundsDuringRecording(true)
} catch {
    print(error)
}

and then you can use:

let generator = UIImpactFeedbackGenerator(style: .light)
generator.prepare()
generator.impactOccurred()

Upvotes: 10

Max Sokolov
Max Sokolov

Reputation: 145

I assume that if you are using AVCaptureSession then you probably have code like this:

do {
    let audioDevice = AVCaptureDevice.default(for: .audio)
    let audioDeviceInput = try AVCaptureDeviceInput(device: audioDevice!)

    if captureSession.canAddInput(audioDeviceInput) {
        captureSession.addInput(audioDeviceInput)
    } else {
        print("Could not add audio device input to the session")
    }
} catch {
    print("Could not create audio device input: \(error)")
}

So audio input is not playing well with haptic engine. You have to remove audio input from capture session before you are playing haptic and then add it back.

Upvotes: 2

Related Questions