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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:15:20