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

