You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 20:05:26