Как проверить, подключены ли Airpods к iPhone? - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь проверить, подключены ли 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 голосов
/ 03 января 2019

Один из способов, который приходит мне в голову, это то, что вы можете использовать Core Bluetooth API для доступа к аэродромам через Bluetooth. Но это может быть излишним, когда вы можете использовать AVSession. Я не знаю, почему именно вы хотите обнаружить только аэродромы и никаких других наушников Bluetooth. Но я думаю, что buildInMic означает встроенный микрофон внутри устройства, а не устройство Bluetooth: P Если вы посмотрите на документы , вы увидите это: P

Вы не просили другую гарнитуру Bluetooth, но в качестве ответа я предоставлю вам этот код, он должен работать для гарнитур без MFI, подключенных к iPhone через Bluetooth.

Теперь к части Airpod.

Возможно, вы хотите использовать ExternalAccessory.framework для связи с Bluetooth-устройствами MFI, такими как Airpods. ~~

Я еще не работал с EAAccessory, но я считаю, что вы должны сделать что-то вроде этого:

  1. Создать экземпляр EAAccessoryManager
  2. Используйте этот экземпляр для получения подключенных устройств
  3. Найти аэродромы по некоторому идентификатору
  4. Выясните, как проверить, подключен ли аксессуар, но это должно быть просто.

Также очень важным шагом является добавление UISupportedExternalAccessoryProtocols в ваш файл info.plist

Я немного устал, поэтому, если у вас есть какие-либо вопросы, завтра я напишу реализацию здесь, если никто не будет быстрее.

Хорошо, очевидно, мой ответ был совершенно неверным.

Сегодня я узнал, что Airpods не указаны в устройствах Apple MFI , поэтому 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) 

Извините за недопонимание и написание совершенно оффтопного ответа. Но, по крайней мере, вы знаете что-то о внешних аксессуарах:)

Также вы можете посмотреть здесь

...