iOS设备未被AVCaptureDevice.devices()识别,仅打开QuickTime后才显示
解决Swift Playground无法枚举USB连接的iPhone摄像头设备问题
嘿,这个问题我之前也踩过坑!本质上是iPhone通过USB连接Mac后,默认处于未激活的「外接相机设备」状态,QuickTime的操作其实是帮你触发了系统对这个设备的会话初始化,所以AVCaptureDevice才能检测到它。下面是几个不用依赖QuickTime的解决办法:
1. 使用新的AVCaptureDeviceDiscoverySession API
旧的AVCaptureDevice.devices()方法已经被苹果废弃,推荐用DiscoverySession来更精准地枚举设备,尤其是外接设备。试试这段代码:
// 创建针对外接视频设备的发现会话 let discoverySession = AVCaptureDevice.DiscoverySession( deviceTypes: [.externalUnknown], mediaType: .video, position: .unspecified ) // 获取所有匹配的设备 let externalDevices = discoverySession.devices for device in externalDevices { print("找到外接设备: \(device.localizedName)") }
.externalUnknown类型会匹配像iPhone这类通过USB连接的外接摄像头,你也可以加上.builtInWideAngleCamera来对比内置摄像头和外接设备的差异。
2. 主动触发设备激活
如果直接枚举还是找不到,可以通过尝试创建临时的AVCaptureSession输入来触发系统激活iPhone设备——这个操作不需要启动会话,仅仅初始化输入就足够触发激活:
func activateConnectediPhoneCamera() { let tempSession = AVCaptureSession() let discoverySession = AVCaptureDevice.DiscoverySession( deviceTypes: [.externalUnknown], mediaType: .video, position: .unspecified ) for device in discoverySession.devices { // 可以通过设备名称判断是不是你的iPhone if device.localizedName.contains("iPhone") { do { let deviceInput = try AVCaptureDeviceInput(device: device) if tempSession.canAddInput(deviceInput) { tempSession.addInput(deviceInput) // 添加输入的动作已经触发了设备激活,用完可以移除 tempSession.removeInput(deviceInput) print("已激活iPhone摄像头设备") } } catch { print("激活失败: \(error.localizedDescription)") } } } } // 先调用激活函数,再枚举设备 activateConnectediPhoneCamera() // 现在再去枚举设备应该就能找到了
3. 检查基础设置
别忽略这些容易漏掉的点:
- 确保Swift Playground在macOS的「系统偏好设置 > 安全性与隐私 > 摄像头」里被授予了权限,不然连内置摄像头都访问不了,更别说外接设备。
- 确认iPhone连接Mac时,你在iPhone上点击了「信任此电脑」,没有信任的话系统根本不会识别这个外接设备。
总结
核心思路就是主动触发系统激活外接设备,而不是依赖QuickTime来完成这件事。用新的DiscoverySession API,再配合临时创建输入的操作,基本就能解决枚举不到的问题了。
内容的提问来源于stack exchange,提问作者Titouan de Bailleul
相关产品推荐
相关产品推荐

