Категория 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);
}