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

macOS 13下ICDeviceBrowser无法识别摄像头问题求助

macOS 13 下 ICDeviceBrowser 无法发现摄像头设备(代理方法不触发)

我们使用ICDeviceBrowser检测Mac连接的摄像头设备,该功能在macOS 12及更早版本运行正常,但升级到macOS 13后,deviceBrowser:didAddDevice:moreComing:代理方法从未被调用,设备数组始终为空。

相关实现代码如下:

@interface NKDeviceBrowser () < NKDeviceBrowserDelegate, ICDeviceBrowserDelegate>
{

-(void)startICDeviceBrowser
{
  NSLog(@"CALL [ %@ ]", NSStringFromSelector(_cmd));

  if ((_browsedDeviceTypeMask & NkDeviceLocationTypeBonjour)) {
    mDeviceBrowser = [[ICDeviceBrowser alloc] init];

    mDeviceBrowser.delegate = self;

    mDeviceBrowser.browsedDeviceTypeMask = (ICDeviceTypeMask)(ICDeviceLocationTypeMaskLocal|ICDeviceTypeMaskCamera|ICDeviceLocationTypeBonjour);

    [mDeviceBrowser start];

  }

}



-(void)deviceBrowser:(ICDeviceBrowser*)browser didAddDevice:(ICDevice*)addedDevice moreComing:(BOOL)moreComing
{
  NSLog(@"CALL [ %@ ]", NSStringFromSelector(_cmd));

  if ( addedDevice.type & ICDeviceTypeCamera ) {
    NSLog(@"Added Device Name %@",addedDevice.name);

    if ([_delegate respondsToSelector:@selector(deviceBrowser:didAddDevice:moreComing:)]) {
      
      [_delegate deviceBrowser:self didAddDevice:addedDevice moreComing:moreComing];

    }

  }

}

}

问题排查与解决方案

1. 补全摄像头权限配置

macOS 13对设备访问权限做了更严格的管控,即使通过ICDeviceBrowser访问设备,也需满足以下要求:

  • 在应用Info.plist中添加NSCameraUsageDescription键,填写清晰的权限申请说明(比如"需要访问摄像头以检测外接摄像设备")。
  • 前往系统设置 > 隐私与安全性 > 摄像头,确认你的应用已被授予摄像头访问权限。

2. 调整设备类型掩码

macOS 13中ICDeviceLocationTypeBonjour与本地设备的检测逻辑可能存在冲突,尝试拆分掩码单独测试:

// 先仅检测本地摄像头
mDeviceBrowser.browsedDeviceTypeMask = ICDeviceTypeMaskCamera | ICDeviceLocationTypeMaskLocal;

若需要同时检测Bonjour设备,建议单独创建一个ICDeviceBrowser实例处理,避免混合掩码导致检测异常。

3. 确保ICDeviceBrowser实例被强引用

检查mDeviceBrowser的引用类型,若为弱引用会被提前释放,导致代理无法触发。建议在类扩展中显式声明为强引用:

@interface NKDeviceBrowser () < NKDeviceBrowserDelegate, ICDeviceBrowserDelegate>
@property (strong, nonatomic) ICDeviceBrowser *mDeviceBrowser;
// ... 其他代码
@end

4. 主动请求摄像头权限

在启动ICDeviceBrowser前,通过AVFoundation主动申请权限,确保系统已授权应用访问摄像头:

[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
    if (granted) {
        dispatch_async(dispatch_get_main_queue(), ^{
            [self startICDeviceBrowser];
        });
    } else {
        // 处理权限被拒绝的逻辑,比如提示用户开启权限
    }
}];

5. 验证代理方法签名

确认deviceBrowser:didAddDevice:moreComing:的方法签名与ICDeviceBrowserDelegate协议完全一致,避免因参数类型或命名错误导致代理无法触发。

内容的提问来源于stack exchange,提问作者Mohit Sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 15:35:48