Cómo detectar iphone está en modo silencioso

Estoy desarrollando una aplicación. ¿En eso quiero detectar a través de la encoding que "es iPhone en modo silencioso o no?". Lo estoy desarrollando mediante el uso de cocoa con Objective-C.

Si alguien lo sabe, responde amablemente.

El motivo por el que el código de Pirripli no funciona es que el simulador no es compatible con la testing y el código no verifica los errores. El código corregido se vería así:

CFStringRef state = nil; UInt32 propertySize = sizeof(CFStringRef); AudioSessionInitialize(NULL, NULL, NULL, NULL); OSStatus status = AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &state); if (status == kAudioSessionNoError) { return (CFStringGetLength(state) == 0); // YES = silent } return NO; 

Es posible probando una ruta de audio NULL usando AudioToolBox:

 UInt32 routeSize = sizeof (CFStringRef); CFStringRef route; AudioSessionGetProperty ( kAudioSessionProperty_AudioRoute, &routeSize, &route ); if (route == NULL) { NSLog(@"Silent switch is on"); } 

Si la ruta es NULL, entonces no hay salidas de audio disponibles. Si se trata de "Auriculares" o "Auriculares", el interruptor del timbre silencioso aún podría estar encendido. Sin embargo, nunca estará encendido cuando esté configurado en "Altavoz".

Probablemente sea mejor que pruebe esto en su escucha de propiedad de cambio de ruta de audio, que se establece a continuación:

 AudioSessionAddPropertyListener ( kAudioSessionProperty_AudioRouteChange, audioRouteChangeListenerCallback, self ); 

Nota: Si estás haciendo algo funky como anular routes de audio, es posible que esta respuesta no se aplique.

Configurar y derribar una session de audio en su totalidad probablemente está más allá del scope de esta respuesta.

Para completar, desarrollando este enlace de Dan Bon, implemento el siguiente método para resolver este problema en mis aplicaciones. Una cosa a tener en count es que el código comtesting primero el simulador de iPhone: al ejecutar el código siguiente, se bloqueará el simulador. Alguien sabe por qué?

 -(BOOL)silenced { #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); if(CFStringGetLength(state) > 0) return NO; else return YES; } 

Declarando esto directamente en el controller de vista, simplemente verificará

 if ([self silenced]) { NSLog(@"silenced"); else { NSLog(@"not silenced"); } 

O, obviamente, podría declararlo en algún tipo de class queueboradora. Una solución más elegante podría ser una adición de categoría en UIApplication o alguna otra class …

Puede utilizar la propiedad Ruta de audio como lo sugieren las respuestas anteriores, pero tenga en count que: – Funciona solo si la Categoría de audio es AmbientSound – No debe inicializar la session de audio más de una vez en su aplicación (consulte la Guía de progtwigción de la session de audio) Debe liberar esos CFStringRef para evitar fugas de mem.

En el caso de que la categoría de audio actual no sea AmbientSound, puede pensar en cambiarlo temporalmente, realizar la comprobación en la propiedad Audio Route y luego restaurar la categoría de audio original.

Tenga en count que cambiar la categoría de audio restaurará la ruta de audio pnetworkingeterminada para esa categoría, dada la configuration actual del hardware (es decir, si hay auriculares enchufados o no, etc.).