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

实例化AVCaptureDeviceInput出错,App模拟器点击相机崩溃如何修复?

Fixing "Unexpectedly found nil" When Instantiating AVCaptureDeviceInput in Simulator

First off, let's get to the root of the problem: the iOS Simulator doesn't have actual camera hardware. When you try to access the camera (like calling AVCaptureDevice.default(for: .video)), it returns nil, and if you're force-unwrapping that optional (using !), that's exactly what triggers the fatal error you're seeing.

Here's how to fix this and make your code robust for both simulator and real devices:

1. Test Camera Functionality on a Real Device

The simplest immediate fix is to run your app on a physical iOS device. The simulator can't access camera hardware, so any camera-related code will fail there. Testing on a real device will let you verify if your core camera logic works as intended.

2. Replace Force-Unwrapping with Safe Optional Binding

Instead of force-unwrapping the capture device (which crashes when nil), use if let or guard let to safely handle the nil case. For example:

// Bad: Force-unwrap will crash in simulator
let captureDevice = AVCaptureDevice.default(for: .video)!

// Good: Safe unwrapping with error handling
guard let captureDevice = AVCaptureDevice.default(for: .video) else {
    // Handle missing camera
    showCameraUnavailableAlert()
    return
}

3. Handle Camera Unavailability Gracefully

When the camera isn't accessible (simulator, device has no camera, or permission denied), display a user-friendly alert instead of crashing. Add a helper function like this:

func showCameraUnavailableAlert() {
    let alert = UIAlertController(
        title: "Camera Unavailable",
        message: "This device doesn't have a camera, or camera access is restricted.",
        preferredStyle: .alert
    )
    alert.addAction(UIAlertAction(title: "OK", style: .default))
    present(alert, animated: true)
}

4. Ensure Camera Permissions Are Properly Configured

Even on a real device, your app will fail to access the camera if you haven't set up permissions correctly.

First, add the NSCameraUsageDescription key to your Info.plist file with a clear message explaining why you need camera access:

<key>NSCameraUsageDescription</key>
<string>We need access to your camera to capture photos and videos.</string>

Then, add code to check and request permission before initializing the camera:

import AVFoundation

func checkCameraPermission() {
    switch AVCaptureDevice.authorizationStatus(for: .video) {
    case .authorized:
        // Permission granted, set up camera
        setupCamera()
    case .notDetermined:
        // Request permission from the user
        AVCaptureDevice.requestAccess(for: .video) { [weak self] granted in
            DispatchQueue.main.async {
                if granted {
                    self?.setupCamera()
                } else {
                    self?.showPermissionDeniedAlert()
                }
            }
        }
    case .denied, .restricted:
        // Permission denied, guide user to settings
        showPermissionDeniedAlert()
    @unknown default:
        break
    }
}

func showPermissionDeniedAlert() {
    let alert = UIAlertController(
        title: "Permission Denied",
        message: "Please enable camera access in Settings to use this feature.",
        preferredStyle: .alert
    )
    alert.addAction(UIAlertAction(title: "Open Settings", style: .default) { _ in
        guard let settingsURL = URL(string: UIApplication.openSettingsURLString) else { return }
        UIApplication.shared.open(settingsURL)
    })
    alert.addAction(UIAlertAction(title: "Cancel", style: .cancel))
    present(alert, animated: true)
}

Call checkCameraPermission() when the user taps the camera button instead of directly initializing the camera. This way, you handle all edge cases without crashing.


内容的提问来源于stack exchange,提问作者Tommaso Pirola

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:29:34