iOS 27 extends 24MP and 48MP capture support to additional cameras (telephoto on iPhone 16 Pro, ultra-wide on iPhone 17) and introduces fast capture prioritization with deferred processing on iPhone 16 and iPhone 17, enabling rapid high-quality shooting without blocking the capture pipeline.
⢠Fast capture prioritization with deferred processing is new in iOS 27 on iPhone 16/17, minimizing shot-to-shot delay even at .quality prioritization
⢠Ultra-wide camera on iPhone 17 now supports 24MP and 48MP captures (previously unavailable)
⢠18MP Center Stage front camera capture added for iPhone 17
⢠Balanced fast captures are now automatically deferred on supported hardware, whereas previously only .quality captures could be deferred
⢠Fast capture prioritization now automatically downgrades quality during rapid bursts and defers final processing, dramatically reducing shot-to-shot delay on iPhone 16/17
⢠18MP and 24MP multi-frame fused captures are now unblocked by deferred processing, letting your app stay responsive while full-quality images are finalized in the background
⢠New camera support (telephoto iPhone 16 Pro, ultra-wide iPhone 17) means more apps can request high-res captures without checking for limited hardware
Configures an AVCaptureSession for 48MP quality captures with fast capture prioritization and deferred processing enabled, then fires a capture and handles both the proxy and final photo callbacks.
import AVFoundation
import Photos
import UIKit
class HighResPhotoCaptureController: NSObject {
let session = AVCaptureSession()
let photoOutput = AVCapturePhotoOutput()
var currentProxyURL: URL?
func configure() throws {
session.beginConfiguration()
session.sessionPreset = .photo
guard let device = AVCaptureDevice.default(.builtInWideAngleCamera,
for: .video,
position: .back),
let input = try? AVCaptureDeviceInput(device: device),
session.canAddInput(input) else {
throw CameraError.deviceUnavailable
}
session.addInput(input)
photoOutput.maxPhotoQualityPrioritization = .quality
photoOutput.isResponsiveCaptureEnabled = true
photoOutput.isFastCapturePrioritizationEnabled = true // iOS 27 + iPhone 16/17
photoOutput.isDeferredPhotoDeliveryEnabled = true
guard session.canAddOutput(photoOutput) else {
throw CameraError.outputUnavailable
}
session.addOutput(photoOutput)
// Select largest supported dimensions from the active format
if let largestDimensions = device.activeFormat
.supportedMaxPhotoDimensions.last {
photoOutput.maxPhotoDimensions = largestDimensions
}
session.commitConfiguration()
// Pre-allocate resources for 48MP quality captures
let prepareSettings = AVCapturePhotoSettings()
prepareSettings.maxPhotoDimensions = photoOutput.maxPhotoDimensions
prepareSettings.photoQualityPrioritization = .quality
photoOutput.setPreparedPhotoSettingsArray([prepareSettings]) { prepared, error in
if prepared {
print("Resources pre-allocated for high-res capture")
}
}
}
func capturePhoto() {
let settings = AVCapturePhotoSettings()
settings.maxPhotoDimensions = photoOutput.maxPhotoDimensions
settings.photoQualityPrioritization = .quality
photoOutput.capturePhoto(with: settings, delegate: self)
}
enum CameraError: Error {
case deviceUnavailable
case outputUnavailable
}
}
extension HighResPhotoCaptureController: AVCapturePhotoCaptureDelegate {
// Called immediately after shutter ā observe expected processing time
func photoOutput(_ output: AVCapturePhotoOutput,
didCapturePhotoFor resolvedSettings: AVCaptureResolvedPhotoSettings) {
let range = resolvedSettings.photoProcessingTimeRange
print("Capture done. Processing: \(range.start.seconds)s ā \(CMTimeAdd(range.start, range.duration).seconds)s")
}
// Deferred processing: receive lightweight proxy immediately
func photoOutput(_ output: AVCapturePhotoOutput,
didFinishCapturingDeferredPhotoProxy deferredPhotoProxy: AVCaptureDeferredPhotoProxy?,
error: Error?) {
guard let proxy = deferredPhotoProxy else { return }
PHPhotoLibrary.shared().performChanges({
let request = PHAssetCreationRequest.forAsset()
request.addResource(with: .photo,
data: proxy.fileDataRepresentation()!,
options: nil)
}) { success, error in
print("Proxy saved to library, final quality will be deferred: \(success)")
}
}
// Fallback: non-deferred delivery
func photoOutput(_ output: AVCapturePhotoOutput,
didFinishProcessingPhoto photo: AVCapturePhoto,
error: Error?) {
guard error == nil,
let data = photo.fileDataRepresentation() else { return }
print("Full-res photo ready: \(data.count / 1_000_000) MB")
}
}maxPhotoDimensions is a request not a guarantee ā always check AVCaptureResolvedSettings for actual delivered dimensions; call setPreparedPhotoSettingsArray early to pre-allocate resources; fastCapturePrioritization silently adjusts quality from .quality to .balanced during rapid firing; you cannot reuse a prepare-settings object as a capture-settings object
48MP requires iPhone 14 Pro or later; 24MP requires iPhone 15 or later; fast capture prioritization with deferred processing requires iPhone 16 or iPhone 17; 18MP Center Stage front camera only on iPhone 17
More iOS 27 APIs land every week.
Get notified when new capabilities are published ā no noise, just signal.