Swift 如何检查Airpods是否连接到iPhone?

Swift 如何检查Airpods是否连接到iPhone?,swift,airpods,Swift,Airpods,我正在检查AirPods是否连接到iPhone。如何以编程方式检查它 对于airpods port.portType值为.builtInMic,这不足以检查airpods是否连接到iphone class func isMicAvailbale() -> Bool{ let availableInputs:[AVAudioSessionPortDescription] = AVAudioSession.sharedInstance().availableInputs ??

我正在检查AirPods是否连接到iPhone。如何以编程方式检查它

对于airpods port.portType值为.builtInMic,这不足以检查airpods是否连接到iphone

class func isMicAvailbale() -> Bool{
        let availableInputs:[AVAudioSessionPortDescription] = AVAudioSession.sharedInstance().availableInputs ?? []
        var micPresent = false;
        for port in availableInputs
        {
            if port.portType == .builtInMic{
                micPresent = true
            }
        }
        return micPresent
    }

我想到的一个方法是,您可以使用
核心蓝牙
API通过蓝牙访问airpods。但如果您可以使用AVSession,这可能会有些过分。我不知道你为什么只想检测airpods而不想检测其他蓝牙耳机。但是我认为
buildInMic
代表设备内部的内置麦克风,而不是蓝牙设备:P如果你仔细看一下,你会看到它:P

您没有要求其他蓝牙耳机,但作为答案的一部分,我将向您提供此代码,这应该适用于通过蓝牙连接到iPhone的非MFI耳机

现在转到Airpod部分。

您可能希望使用
ExternalAccessory.framework
与MFI蓝牙设备(如Airpods)进行通信~~

我还没有使用过
EAAccessory
,但我相信您必须这样做:

  • 创建EAAccessoryManager的实例
  • 使用该实例获取连接的设备
  • 通过一些ID查找airpods
  • 找出如何检查附件是否连接,但这应该是小菜一碟 另一个非常重要的步骤是向info.plist文件中添加
    UISupportDexternalAccessoryProtocols

    我有点累了,所以如果你有任何问题,明天我会在这里写实现,如果没有人会更快

    很明显,我的答案一开始就完全错了

    我今天了解到,Airpods没有列在中,因此ExternalAccessorymanager显然无法工作。正如页脚中提到的答案中所述,您需要做的只是将类别添加到AVSession中

    所以整个代码基本上都在这里:D

     let session = AVAudioSession.sharedInstance()
            try! session.setCategory(.playAndRecord, mode: .default, options: .allowBluetooth)
            guard let availableInputs = session.availableInputs else { return }
            for input in availableInputs {
                if input.portType == .bluetoothHFP {
                    // Do your stuff...
                }
            }
    
    证明:

    2019-01-04 02:32:13.462093+0100 Accessory games[24578:5411208] [avas] AVAudioSessionPortImpl.mm:56:ValidateRequiredFields: Unknown selected data source for Port Butcher’s AirPods (type: BluetoothHFP)
    (lldb) po availableInputs
    ▿ 2 elements
      - 0 : <AVAudioSessionPortDescription: 0x283b401b0, type = MicrophoneBuiltIn; name = iPhone Mikrofon; UID = Built-In Microphone; selectedDataSource = Vpředu>
      - 1 : <AVAudioSessionPortDescription: 0x283b40250, type = BluetoothHFP; name = Butcher’s AirPods; UID = 10:94:BB:5D:5F:F7-tsco; selectedDataSource = (null)>
    
    (lldb) po availableInputs[1].portName
    "Butcher’s AirPods"
    
    (lldb) po availableInputs[1].portType
    ▿ AVAudioSessionPort
      - _rawValue : BluetoothHFP
    
    (lldb) 
    
    2019-01-04 02:32:13.462093+0100附属游戏[24578:5411208][avas]AVAudioSessionPortImpl.mm:56:ValidateRequiredFields:Port Butcher's AirPods的未知选定数据源(类型:BluetoothHFP)
    (lldb)采购订单可用输入
    ▿ 2要素
    
    -0:

    我想到的一个方法是,您可以使用
    核心蓝牙
    API通过蓝牙访问airpods。但如果您可以使用AVSession,这可能会有些过分。我不知道你为什么只想检测airpods而不想检测其他蓝牙耳机。但是我认为
    buildInMic
    代表设备内部的内置麦克风,而不是蓝牙设备:P如果你仔细看一下,你会看到它:P

    您没有要求其他蓝牙耳机,但作为答案的一部分,我将向您提供此代码,这应该适用于通过蓝牙连接到iPhone的非MFI耳机

    现在转到Airpod部分。

    您可能希望使用
    ExternalAccessory.framework
    与MFI蓝牙设备(如Airpods)进行通信~~

    我还没有使用过
    EAAccessory
    ,但我相信您必须这样做:

  • 创建EAAccessoryManager的实例
  • 使用该实例获取连接的设备
  • 通过一些ID查找airpods
  • 找出如何检查附件是否连接,但这应该是小菜一碟 另一个非常重要的步骤是向info.plist文件中添加
    UISupportDexternalAccessoryProtocols

    我有点累了,所以如果你有任何问题,明天我会在这里写实现,如果没有人会更快

    很明显,我的答案一开始就完全错了

    我今天了解到,Airpods没有列在中,因此ExternalAccessorymanager显然无法工作。正如页脚中提到的答案中所述,您需要做的只是将类别添加到AVSession中

    所以整个代码基本上都在这里:D

     let session = AVAudioSession.sharedInstance()
            try! session.setCategory(.playAndRecord, mode: .default, options: .allowBluetooth)
            guard let availableInputs = session.availableInputs else { return }
            for input in availableInputs {
                if input.portType == .bluetoothHFP {
                    // Do your stuff...
                }
            }
    
    证明:

    2019-01-04 02:32:13.462093+0100 Accessory games[24578:5411208] [avas] AVAudioSessionPortImpl.mm:56:ValidateRequiredFields: Unknown selected data source for Port Butcher’s AirPods (type: BluetoothHFP)
    (lldb) po availableInputs
    ▿ 2 elements
      - 0 : <AVAudioSessionPortDescription: 0x283b401b0, type = MicrophoneBuiltIn; name = iPhone Mikrofon; UID = Built-In Microphone; selectedDataSource = Vpředu>
      - 1 : <AVAudioSessionPortDescription: 0x283b40250, type = BluetoothHFP; name = Butcher’s AirPods; UID = 10:94:BB:5D:5F:F7-tsco; selectedDataSource = (null)>
    
    (lldb) po availableInputs[1].portName
    "Butcher’s AirPods"
    
    (lldb) po availableInputs[1].portType
    ▿ AVAudioSessionPort
      - _rawValue : BluetoothHFP
    
    (lldb) 
    
    2019-01-04 02:32:13.462093+0100附属游戏[24578:5411208][avas]AVAudioSessionPortImpl.mm:56:ValidateRequiredFields:Port Butcher's AirPods的未知选定数据源(类型:BluetoothHFP)
    (lldb)采购订单可用输入
    ▿ 2要素
    
    -0:

    嘿,我编辑了我的答案,之前我撒了一点谎,我不知道Airpods不是苹果MFI。对不起,你的timeloss:(嘿,我编辑了我的答案,我之前撒了一点谎,我不知道Airpods不是Apple MFI。对不起,你的timeloss:(一切正常,但我在console
    AVAudioSessionPortImpl.mm:56:ValidateRequiredFields:Port Pooja的Airpods的未知选定数据源(类型:BluetoothHFP)
    这个错误没关系,只是苹果方面的问题,你可以通过一些方法设置数据源。这个方法告诉我airpods是否连接到iphone,我如何判断airpods是否真的在某人的耳朵里。这不是正确答案。这个检查对任何蓝牙耳机都是肯定的,而不仅仅是AirPods@rommex写使用CoreBluetooth的down解决方案一切正常,但我在控制台中不断遇到此错误
    AVAudioSessionPortImpl.mm:56:ValidateRequiredFields:Port Pooja的AirPods的未知选定数据源(类型:BluetoothHFP)
    这个错误没关系,只是苹果方面的问题,你可以通过一些方法设置数据源。这个方法告诉我airpods是否连接到iphone,我如何判断airpods是否真的在某人的耳朵里。这不是正确答案。这个检查对任何蓝牙耳机都是肯定的,而不仅仅是AirPods@rommex写使用CoreBluetooth的停机解决方案