SwiftUI中AVCaptureDevice.default返回nil致崩溃,寻求解决方案
解决相机初始化崩溃及设备返回nil的问题
问题根源
你代码里直接指定.builtInDualCamera并强制解包,不是所有iOS设备都配备前置双摄像头(比如旧款iPhone、部分iPad,或是部分设备仅后置有双摄),当设备硬件不匹配时,device会返回nil,强制解包直接触发崩溃。
修复方案
1. 移除强制解包,增加安全降级逻辑
先替换掉device!的强制解包,用可选绑定处理,同时为不同硬件配置提供降级选项:
func setUp() { do { self.session.beginConfiguration() // 优先尝试前置双摄 if let dualCamera = AVCaptureDevice.default(.builtInDualCamera, for: .video, position: .front) { try addCameraInput(to: dualCamera) } // 降级尝试前置广角摄像头 else if let wideCamera = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .front) { try addCameraInput(to: wideCamera) } // 最后尝试原深感前置摄像头(iPhone X及以后机型) else if let trueDepthCamera = AVCaptureDevice.default(.builtInTrueDepthCamera, for: .video, position: .front) { try addCameraInput(to: trueDepthCamera) } // 所有前置摄像头都不可用的情况 else { print("无可用前置摄像头") self.session.commitConfiguration() return } if self.session.canAddOutput(self.output) { self.session.addOutput(self.output) } self.session.commitConfiguration() } catch { print(error.localizedDescription) } } // 提取输入添加逻辑,复用代码 private func addCameraInput(to device: AVCaptureDevice) throws { let input = try AVCaptureDeviceInput(device: device) if self.session.canAddInput(input) { self.session.addInput(input) } }
2. 完善权限检查流程
即使配置了Info.plist权限,也要确保用户已授权后再初始化相机:
func startCameraSetup() { switch AVCaptureDevice.authorizationStatus(for: .video) { case .authorized: setUp() case .notDetermined: AVCaptureDevice.requestAccess(for: .video) { [weak self] granted in DispatchQueue.main.async { granted ? self?.setUp() : print("用户拒绝相机权限") } } case .denied, .restricted: print("相机权限被拒绝或受限,请前往设置开启") @unknown default: break } }
调用时先执行startCameraSetup(),再触发初始化流程,避免权限问题引发异常。
3. 确认权限配置正确性
检查Info.plist中是否添加了必填权限键:
NSCameraUsageDescription:相机权限使用说明(必填)- 如果涉及音频录制,还需添加
NSMicrophoneUsageDescription
内容的提问来源于stack exchange,提问作者RabHat
相关产品推荐
相关产品推荐

