Подключена ли проводная гарнитура?iOS12 - PullRequest
0 голосов
/ 05 декабря 2018

Наше приложение по умолчанию использует динамик для вывода звука.Однако нам также нужно показать пользователю, доступны ли проводные наушники (вставленные во время жизненного цикла приложения или даже до его запуска).Следовательно.нам нужно определить, подключена ли проводная гарнитура.Мы могли бы использовать наушники с вызовами iPhone и т. Д., А также символ наушников виден на iPhone, чтобы гарантировать, что наушники работают и обнаруживаются iPhone.

Мы используем следующий код, который хорошо обсуждался и предлагался в различных темах ( здесь ) и блогах, но он больше не работает в iOS 12, если динамик включен.

- (BOOL)isHeadsetPluggedIn {
    AVAudioSessionRouteDescription* route = [[AVAudioSession sharedInstance] currentRoute];
    for (AVAudioSessionPortDescription* desc in [route outputs]) {
        if ([[desc portType] isEqualToString:AVAudioSessionPortHeadphones])
            return YES;
    }
    return NO;
}

, если динамик включен, currentRoute возвращает только «Динамик», и, следовательно, обнаружение наушников завершается неудачно, а вышеуказанный код возвращает NO.

Мы также пытались проверить доступные входы, используя следующий код, но наушников там нет

NSArray<AVAudioSessionPortDescription *> *availableInputs =
[[AVAudioSession sharedInstance] availableInputs];

for (AVAudioSessionPortDescription* desc in availableInputs) {
    NSLog(@"Available Port type: %@", [desc portType]);
}

Это возвращает только «MicrophoneBuiltIn» (и Bluetooth, если Bluetooth включен), но без наушников.

Ниже приведен код, который мы используем для включения / выключения колонок.

- (BOOL)switchSpeaker:(BOOL)onOrOff
{
    NSError* audioError = nil;
    BOOL changeResult = NO;

    AVAudioSessionPortOverride override = onOrOff?AVAudioSessionPortOverrideSpeaker:AVAudioSessionPortOverrideNone;

    changeResult = [[AVAudioSession sharedInstance] overrideOutputAudioPort:override                        error:&audioError];

    return changeResult;
}

Есть идеи?

...