Категория AVAudioSession не работает, как того требует документация

У меня есть приложение для iOS, которое в некоторых местах имеет звуковую обратную связь, но я хочу, чтобы любая другая музыка, которую играет пользователь в фоновом режиме, была разрешена для воспроизведения поверх этого. Кроме того, я хочу, чтобы звук в моем приложении соответствовал выключателю звука. Согласно документации разработчика, все эти функции должны быть включены категорией окружения AVAudioSession. Это код, который я использую:

if (!hasInitialisedAudioSession) {
    AVAudioSession *session = [AVAudioSession sharedInstance];
    [session setCategory:AVAudioSessionCategoryAmbient error:NULL];

    [session setActive:YES error:NULL];

    hasInitialisedAudioSession = YES;
}

Код выполняется просто отлично, и он действительно позволяет воспроизвести звуки приложения поверх музыки iPod. Однако он не уважает переключатель отключения звука. Я пытался заменить этот код на похожие аудио-вызовы C (например, AudioSessionSetProperty) вместо вызовов Objective-C, но я получаю тот же результат - категория сессионных окружающих просто не хочет уважать переключатель отключения звука, несмотря на то, что документация говорит, что это должно быть сделано.

Есть идеи? Спасибо за помощь:)

1 ответ

Решение

Я думаю, что мне удалось это решить - оказывается, что это не имеет ничего общего с моим приложением, а скорее с приложением iPod. Мое приложение подчиняется переключателю отключения звука, как и должно, когда iPod не воспроизводится, и затем позволяет iPod воспроизводить его поверх него - все, что я хотел. Тем не менее, когда проигрывается iPod, приложение перестает реагировать на выключение звука, поэтому я думаю, что это просто то, что iPod делает с настройками звука устройства. Я мог бы, вероятно, обойти это, если бы я действительно хотел тратить на это время, но пока он подчиняется выключателю звука, когда iPod не играет, это достаточно хорошо для меня.

РЕДАКТИРОВАТЬ: чтобы обойти это, просто используйте эту функцию, чтобы определить, включен ли переключатель отключения звука вручную, и не воспроизводите ваши звуки, если результат ДА. Хотя может быть немного больно, если у вас нет централизованного класса аудио-менеджера. Было бы неплохо, если бы Apple смогла опубликовать это поведение в своей документации.

- (BOOL)deviceIsSilenced
{
    #if TARGET_IPHONE_SIMULATOR
    // return NO in simulator. Code causes crashes for some reason.
    return NO;
    #endif

    CFStringRef state;
    UInt32 propertySize = sizeof(CFStringRef);
    AudioSessionInitialize(NULL, NULL, NULL, NULL);
    AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &state);

    return (CFStringGetLength(state) <= 0);
}
Другие вопросы по тегам