Skip to content

Commit

Permalink
fix(ios): use native camera selection for optimal focus
Browse files Browse the repository at this point in the history
The CameraController now prioritizes `builtInTripleCamera` and similar options to select the best fitting camera. This enhances continuous auto-focus on newer iPhones, especially Pro models.

Closes: capacitor-community#324
Addresses: capacitor-community#256
  • Loading branch information
michaelwolz committed Jun 6, 2024
1 parent 50d492f commit 9ec31de
Showing 1 changed file with 23 additions and 20 deletions.
43 changes: 23 additions & 20 deletions ios/Plugin/CameraController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -45,25 +45,29 @@ extension CameraController {
}

func configureCaptureDevices() throws {

let session = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInWideAngleCamera], mediaType: AVMediaType.video, position: .unspecified)

let cameras = session.devices.compactMap { $0 }
guard !cameras.isEmpty else { throw CameraControllerError.noCamerasAvailable }

for camera in cameras {
if camera.position == .front {
self.frontCamera = camera
}

if camera.position == .back {
self.rearCamera = camera

try camera.lockForConfiguration()
camera.focusMode = .continuousAutoFocus
camera.unlockForConfiguration()
}
}
// For the front camera we are simply using the default one. iOS will automatically provide the best fit here
self.frontCamera = AVCaptureDevice.default(.builtInWideAngleCamera, for: AVMediaType.video, position: .front)

// For the rear camera we'll use a discovery session that will follow the list of "best" cameras to choose from
let deviceTypes: [AVCaptureDevice.DeviceType] = [
.builtInTripleCamera,
.builtInDualWideCamera,
.builtInDualCamera,
.builtInWideAngleCamera,
]

let discoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: deviceTypes, mediaType: AVMediaType.video, position: .back)

// We then define the first camera as rear camera. The devices are already sorted based on the provided device types
// See: https://developer.apple.com/documentation/avfoundation/capture_setup/choosing_a_capture_device#2958877
guard let rearCamera = discoverySession.devices.first else { throw CameraControllerError.noCamerasAvailable }

try rearCamera.lockForConfiguration()
rearCamera.focusMode = .continuousAutoFocus
rearCamera.unlockForConfiguration()

self.rearCamera = rearCamera

if disableAudio == false {
self.audioDevice = AVCaptureDevice.default(for: AVMediaType.audio)
}
Expand Down Expand Up @@ -138,7 +142,6 @@ extension CameraController {
try configureDeviceInputs()
try configurePhotoOutput()
try configureDataOutput()
// try configureVideoOutput()
} catch {
DispatchQueue.main.async {
completionHandler(error)
Expand Down

0 comments on commit 9ec31de

Please sign in to comment.