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

React Native中AVCaptureDevice.isTorchActive无法正常工作的问题排查

React Native iOS自定义模块检测手电筒状态的问题排查与解决

核心问题分析

你遇到的问题本质是iOS平台上访问手电筒状态的方式不正确,尤其是系统控制中心切换属于外部操作,常规KVC监听和未正确处理权限/设备初始化的检测都会失效。

常见错误点及修复方案

1. 缺失相机权限

手电筒属于相机硬件的附属功能,即使仅读取状态也需要相机权限,否则无法访问AVCaptureDevice的torch相关属性,导致始终返回off或0.0。

  • 修复:
    • 在Info.plist中添加相机权限描述:
      <key>NSCameraUsageDescription</key>
      <string>需要访问相机以检测手电筒状态</string>
      
    • 在模块初始化时主动请求权限,权限通过后再进行状态检测或监听。

2. AVCaptureDevice实例获取/初始化错误

如果未正确获取支持手电筒的设备实例,或者未检查设备是否具备torch功能,会导致状态读取失效。

  • 修复:
    必须通过AVMediaType.video类型获取默认设备,且先校验hasTorch属性:
    AVCaptureDevice *torchDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    if (!torchDevice || !torchDevice.hasTorch) {
        // 设备不支持手电筒
        return @"not_available";
    }
    

3. KVC监听isTorchActive不可靠

isTorchActive是iOS的计算属性,系统并不会为它发送KVO变更通知,尤其是控制中心切换这种外部操作,不会触发你注册的KVC监听。

  • 替代方案:使用系统原生通知AVCaptureDeviceTorchModeDidChangeNotification,这是iOS官方提供的手电筒状态变更通知,无论通过哪种方式切换(控制中心、APP内)都会触发。
    示例代码:
    // 注册监听
    - (void)setupTorchListener {
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(onTorchModeChanged:)
                                                     name:AVCaptureDeviceTorchModeDidChangeNotification
                                                   object:nil];
    }
    
    // 处理状态变更
    - (void)onTorchModeChanged:(NSNotification *)note {
        AVCaptureDevice *device = note.object;
        if (device.hasTorch) {
            BOOL isOn = (device.torchMode == AVCaptureTorchModeOn);
            // 向React Native发送事件
            [self sendEventWithName:@"TorchStatusUpdated" body:@{@"status": isOn ? @"on" : @"off"}];
        }
    }
    
    // 模块销毁时移除监听
    - (void)dealloc {
        [[NSNotificationCenter defaultCenter] removeObserver:self];
    }
    

4. 手动检测状态时未刷新设备配置

直接读取torchMode或isTorchActive可能拿到缓存值,尤其是控制中心切换后,设备状态未同步到你的APP进程。

  • 修复:手动检测时先锁定设备配置(无需修改,只是强制刷新状态):
    - (NSString *)checkTorchStatus {
        AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
        if (!device || !device.hasTorch) return @"not_available";
    
        NSError *error = nil;
        if ([device lockForConfiguration:&error]) {
            NSString *status = (device.torchMode == AVCaptureTorchModeOn) ? @"on" : @"off";
            [device unlockForConfiguration];
            return status;
        } else {
            NSLog(@"锁定设备失败:%@", error.localizedDescription);
            return @"error";
        }
    }
    

额外注意事项

  • 所有AVCaptureDevice相关操作必须在主线程执行,React Native模块中可以通过dispatch_async(dispatch_get_main_queue(), ^{ ... })确保线程安全。
  • 测试时务必使用真实设备,模拟器不支持手电筒功能。

内容的提问来源于stack exchange,提问作者Jaroslaw K.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 20:10:26