iOS 18更新后ICDeviceBrowser无法识别外接相机问题求助
iOS 18 下 ImageCaptureCore 外接相机检测问题及解决方案
问题概述
使用ImageCaptureCore框架的ICDeviceBrowser查找USB外接相机的功能,在iOS 18前正常运行,但升级后无法检测设备,也不触发代理事件。排查发现Contents授权状态为未确定,请求授权时无用户弹窗直接返回拒绝,已配置Camera隐私描述且相机权限请求正常。
解决 Contents 授权问题
1. 补充 Info.plist 权限描述
iOS 18 对ImageCaptureCore的外接设备Contents访问新增了单独的权限要求,需在Info.plist中添加对应的权限描述键:
<key>NSImageCaptureCoreContentsUsageDescription</key> <string>需要访问外接相机的内容以获取照片/视频</string>
如果上述键不生效,可尝试补充添加NSContentsUsageDescription,确保系统能识别权限申请的用途。
2. 正确发起授权请求
不要尝试手动触发授权,需使用ImageCaptureCore官方授权API发起请求,确保触发系统权限弹窗:
import ImageCaptureCore ICDeviceAuthorizationManager.requestAuthorization(for: .contents) { status in switch status { case .authorized: // 授权成功后启动ICDeviceBrowser self.startDeviceBrowser() case .denied, .restricted: // 授权失败,提示用户前往系统设置开启权限 break case .notDetermined: // 理论上不会进入此分支,因为已发起授权请求 break @unknown default: break } }
注意:必须在启动ICDeviceBrowser前完成授权请求,且确认授权状态为.authorized后再初始化浏览器。
3. 排查权限异常的其他可能
- 检查系统设置:前往「设置」→「你的应用」→「权限」,确认「Contents」权限是否被手动拒绝。
- 验证签名配置:确保应用签名未禁用相关权限的entitlement。
替代 Apple 库方案
如果ImageCaptureCore的问题无法快速解决,可尝试以下官方替代方案:
1. AVFoundation
通过AVCaptureDeviceDiscoverySession枚举外接视频设备,适合仅需获取相机视频流或拍照的场景:
import AVFoundation let discoverySession = AVCaptureDevice.DiscoverySession( deviceTypes: [.externalUnknown], mediaType: .video, position: .unspecified ) for device in discoverySession.devices { // 识别到外接相机设备 print("外接相机:\(device.localizedName)") }
2. Photos 框架(仅导入场景)
如果需求是从外接相机导入照片/视频,可使用PHPicker配合外部源选择,系统会自动处理外接设备的访问:
import PhotosUI let configuration = PHPickerConfiguration(photoLibrary: .shared()) configuration.filter = .images configuration.selectionLimit = 1 let picker = PHPickerViewController(configuration: configuration) picker.delegate = self present(picker, animated: true)
3. FileProvider 框架(文件访问场景)
若外接相机以文件系统形式挂载,可使用FileProvider框架访问设备内的文件,此方案更适合文件浏览,而非相机控制。
内容的提问来源于stack exchange,提问作者Alex Plishka
相关产品推荐
相关产品推荐

