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

AVCaptureDevice的isFlashModeSupported与setFlashMode已弃用,求新设置方法

解决AVCaptureDevice闪光灯模式设置的弃用问题

别担心,这个问题是iOS 17/macOS 14之后苹果更新相机API带来的——旧的isFlashModeSupported:、setFlashMode:方法以及flashMode属性确实都被弃用了,现在需要通过AVCaptureDeviceFlashControl这个新类来管理闪光灯操作。

核心变化说明

苹果把闪光灯的控制逻辑单独抽离到了AVCaptureDeviceFlashControl中,所有和闪光灯相关的检查、设置都要通过这个类来完成,而不是直接操作AVCaptureDevice本身。

更新后的代码实现

这里给你适配了新API的版本,同时保留了旧版本的兼容性(如果需要支持iOS 16及更早系统):

+ (void)setFlashMode:(AVCaptureFlashMode)flashMode forDevice:(AVCaptureDevice *)device {
    // 适配iOS 17+/macOS 14+的新API
    if (@available(iOS 17.0, macOS 14.0, *)) {
        AVCaptureDeviceFlashControl *flashControl = device.flashControl;
        // 检查闪光灯是否可用,以及目标模式是否被支持
        if (flashControl.isAvailable && [flashControl isModeSupported:flashMode]) {
            NSError *error = nil;
            if ([device lockForConfiguration:&error]) {
                flashControl.mode = flashMode;
                [device unlockForConfiguration];
            } else {
                NSLog(@"Failed to lock device configuration: %@", error);
            }
        }
    } else {
        // 兼容旧版本系统的原有逻辑
        if ([device hasFlash] && [device isFlashModeSupported:flashMode]) {
            NSError *error = nil;
            if ([device lockForConfiguration:&error]) {
                [device setFlashMode:flashMode];
                [device unlockForConfiguration];
            } else {
                NSLog(@"%@", error);
            }
        }
    }
}

关键注意点

  • flashControl.isAvailable替代了原来的[device hasFlash],它不仅会检查设备硬件是否有闪光灯,还会判断当前设备状态是否允许使用闪光灯(比如是否在录像、是否被系统限制等)
  • [flashControl isModeSupported:flashMode]替代了旧的[device isFlashModeSupported:flashMode],用来验证目标闪光灯模式是否被当前设备支持
  • 设置模式时必须通过flashControl.mode赋值,而不是直接修改device.flashMode——这也是你之前直接赋值仍会收到警告的原因

内容的提问来源于stack exchange,提问作者Harry McGovern

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:03:43