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
相关产品推荐
相关产品推荐

