6

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)
Vukašin Manojlović
  • 3,717
  • 3
  • 19
  • 31
JasonAddFour
  • 153
  • 1
  • 1
  • 10

2 Answers2

4

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()
Vukašin Manojlović
  • 3,717
  • 3
  • 19
  • 31
2

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.

Max Sokolov
  • 145
  • 1
  • 11