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

时间:2019-01-02 23:37:19

标签: swift airpods

我正在尝试检查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
    }

1 个答案:

答案 0 :(得分:2)

我想到的一种方法是,您可以使用Core Bluetooth API通过蓝牙访问airpods。但是,当您可以使用AVSession时,这可能会显得有些矫kill过正。我不知道您为什么只想检测airpods而没有其他蓝牙耳机。但是我认为buildInMic代表设备内部的buildIn麦克风,而不是蓝牙设备:P如果您查看docs可以看到:P

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

现在是Airpod的一部分。

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

我尚未与EAAccessory合作,但我相信您必须执行以下操作:

  1. 创建EAAccessoryManager的实例
  2. 使用该实例获取已连接的设备
  3. 通过某些ID查找airpods
  4. 弄清楚如何检查附件是否已连接,但这应该是小菜一碟。

非常重要的一步是将UISupportedExternalAccessoryProtocols添加到您的info.plist文件中

我有点累,所以如果您有任何问题要问,明天如果没有人会更快,我将在这里编写实现。

好吧,很明显,我的回答一开始是完全错误的。

我今天了解到,apple's MFI devices中未列出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) 

很抱歉造成误解并写出完全脱题的答案。但是,嘿,至少您对外部配件有所了解:)

您可能还想看看here