Torch Freezes Ultra-Wide Camera When Switching Between Wide & Ultra-Wide Lenses (AVFoundation Bug?)

I'm developing an iOS app using AVFoundation for real-time video capture and object detection.

While implementing torch functionality with camera switching (between Wide and Ultra-Wide lenses), I encountered a critical issue where the camera freezes when toggling the torch while the Ultra-Wide camera is active.

Issue

  • If the torch is ON and I switch from Wide to Ultra-Wide, the camera freezes
  • If the Ultra-Wide camera is active and I try to turn the torch ON, the camera freezes
  • The iPhone Camera app allows using the torch while recording video with the Ultra-Wide lens, so this should be possible via AVFoundation as well.

Code snippet

    DispatchQueue.global(qos: .userInitiated).async { [weak self] in
        guard let self = self else { return }

        let isSwitchingToUltraWide = !self.isUsingFisheyeCamera
        let cameraType: AVCaptureDevice.DeviceType = isSwitchingToUltraWide ? .builtInUltraWideCamera : .builtInWideAngleCamera
        let cameraName = isSwitchingToUltraWide ? "Ultra Wide" : "Wide"

        guard let selectedCamera = AVCaptureDevice.default(cameraType, for: .video, position: .back) else {
            DispatchQueue.main.async {
                self.showAlert(title: "Camera Error", message: "\(cameraName) camera is not available on this device.")
            }
            return
        }

        do {
            let currentInput = self.videoCapture.captureSession.inputs.first as? AVCaptureDeviceInput

            self.videoCapture.captureSession.beginConfiguration()

            if isSwitchingToUltraWide && self.isFlashlightOn {
                self.forceEnableTorchThroughWide()
            }

            if let currentInput = currentInput {
                self.videoCapture.captureSession.removeInput(currentInput)
            }

            let videoInput = try AVCaptureDeviceInput(device: selectedCamera)
            self.videoCapture.captureSession.addInput(videoInput)

            self.videoCapture.captureSession.commitConfiguration()

            self.videoCapture.updateVideoOrientation()

            DispatchQueue.main.async {
                if let barButton = sender as? UIBarButtonItem {
                    barButton.title = isSwitchingToUltraWide ? "Wide" : "Ultra Wide"
                    barButton.tintColor = isSwitchingToUltraWide ? UIColor.systemGreen : UIColor.white
                }
                print("Switched to \(cameraName) camera.")
            }

            self.isUsingFisheyeCamera.toggle()
        } catch {
            DispatchQueue.main.async {
                self.showAlert(title: "Camera Error", message: "Failed to switch to \(cameraName) camera: \(error.localizedDescription)")
            }
        }
    }
}

Expected Behavior

  • Torch should be able to work when Ultra-Wide is active, just like the iPhone Camera app does.
  • The camera should not freeze when switching between Wide and Ultra-Wide with the torch ON.
  • AVCaptureSession should not crash when toggling the torch while Ultra-Wide is active.

Questions & Help Needed

  • Is this a known issue with AVFoundation?
  • How does the iPhone Camera app allow using the torch while recording in Ultra-Wide?
  • What’s the correct way to switch between Wide and Ultra-Wide cameras without freezing when the torch is active?

Info

Device tested: iPhone 13 Pro / iPhone 15 Pro / Iphone 15

iOS Version: iOS 17.3 / iOS 18.0

Xcode Version: 16.2

Torch Freezes Ultra-Wide Camera When Switching Between Wide & Ultra-Wide Lenses (AVFoundation Bug?)
 
 
Q