A detecção do comutador de toque / silêncio / mudo do iPhone usando o AVAudioPlayer não está funcionando?

Tentei usar esses métodos na tentativa de detectar se a opção Ring / Silent está ativa ou não:

Como detectar programaticamente a chave de mudo do iPhone?

categoria @AVAudioSession não está funcionando como determina a documentação

Mas no meu iPhone 4, o valor "state" é sempre "Speaker" (e o valor do comprimento retornado por CFStringGetLength (state) é sempre 7). Alguém já usou esse método com sucesso? Em caso afirmativo, em que tipo de dispositivo e versão do SDK?

Estou chamando assim:


- (BOOL)deviceIsSilenced {
    CFStringRef state;
    UInt32 propertySize = sizeof(CFStringRef);
    OSStatus audioStatus = AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &state);
    if (audioStatus == kAudioSessionNoError) {
        NSLog(@"audio route: %@", state) // "Speaker" regardless of silent switch setting, but "Headphone" when my headphones are plugged in
        return (CFStringGetLength(state) <= 0);
    }
    return NO;
}

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    audioSession.delegate = self;
    [audioSession setCategory:AVAudioSessionCategoryAmbient error:nil];
    [audioSession setActive:YES error:nil];
    NSLog(@"muted? %i", [self deviceIsSilenced]);
    ...
}

Eu estava pensando que talvez algum outro evento (mais preciso) do kAudioSessionProperty seja acionado quando o comutador físico do telefone for ... comutado. Alguém tem alguma ideia

A propósito, estou usando a categoria AVAudioSessionCategoryAmbient com minha [AVAudioSession sharedInstance].

Atualizar Eu também tentei usar diferentes categorias de áudio e várias outras propriedades da sessão de áudio, nenhuma parece disparar quando o interruptor é desativado ou desativado. :

Jan. Atualização de 1 de 2014: É um pouco complicado, e encontrei uma falha ao executar multitarefas no meu iPhone 5S, mas o SoundSwitch biblioteca @ vinculada na nova resposta aceita é o caminho a seguir, se você deseja detectar a opção silenciosa. Até funciona no iOS 7.

questionAnswers(7)

yourAnswerToTheQuestion