objective c - usar - Reciba eventos de control remoto sin audio
control remoto universal (2)
Aquí hay información básica, de lo contrario salte a la pregunta en negrita. Estoy construyendo una aplicación y me gustaría que tenga acceso a los eventos de control remoto / pantalla de bloqueo. La parte difícil es que esta aplicación no reproduce el audio en sí, sino que controla el audio de otro dispositivo cercano. La comunicación entre dispositivos no es un problema cuando la aplicación está en primer plano. Como acabo de descubrir, una aplicación no asume el control de los controles remotos hasta que haya reproducido audio con una sesión de audio de reproducción, y fue la última vez que lo hizo. Esto presenta un problema porque, como dije, la aplicación controla el audio de OTRO dispositivo y no tiene necesidad de jugar por sí mismo.
Mi primera inclinación es hacer que la aplicación reproduzca un clip silencioso cada vez que se abra para asumir el control de los controles remotos. El hecho de que tenga que hacer esto me hace preguntarme si Apple me permitirá hacerlo o si hay otra forma de lograrlo sin engañar al sistema con clips de audio falsos.
PREGUNTA (S): ¿Apple aprobará una aplicación que reproduzca un clip de audio silencioso para asumir el control de los controles de la pantalla de control remoto / bloqueo con el fin de controlar el audio de otro dispositivo? ¿Hay alguna manera de asumir el control de los controles remotos sin una sesión de audio?
PD: Preferiría tener esta funcionalidad en iOS 4.0 y superior.
PPS He visto esta pregunta similar y me ha hecho una lluvia de ideas, pero la respuesta proporcionada no es específica de lo que necesito saber.
¡La solución de Moshe me fue genial! Sin embargo, un problema que noté es que cuando pausaste el audio, los controles de medios desaparecieron y no podrás volver a jugar sin volver a la aplicación. Si configura la información multimedia en la pantalla de bloqueo cuando reproduce el audio, esto no sucederá:
NSDictionary *mediaInfo = @{MPMediaItemPropertyTitle: @"My Title",
MPMediaItemPropertyAlbumTitle: @"My Album Name",
MPMediaItemPropertyPlaybackDuration: [NSNumber numberWithFloat:0.30f]};
[[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:mediaInfo];
NOTA: A partir de iOS 7.1, debe utilizar MPRemoteCommandCenter en lugar de la respuesta a continuación.
Cree varias subclases proporcionadas por el sistema de MPRemoteCommand y asígnelas a las propiedades de [MPRemoteCommandCenter sharedCommandCenter]
.
Me estoy quedando con el resto de esto para referencia histórica, pero no se garantiza que lo siguiente funcione en versiones recientes de iOS. De hecho, es posible que no.
Definitivamente necesita un reproductor de audio , pero no necesariamente una sesión explícita para tomar el control de los eventos de control remoto. ( AVAudioSession
está implícito en cualquier aplicación que AVAudioSession
audio.) Pasé una cantidad decente de tiempo jugando con esto para confirmar esto.
He visto mucha confusión en Internet sobre dónde configurar el método removeControlEventRecievedWithEvent:
y varios enfoques para la cadena de respuesta. Sé que este método funciona en iOS 6 e iOS 7. Otros métodos no. No pierda su tiempo manejando eventos de control remoto en el delegado de la aplicación (donde solían trabajar) o en un controlador de vista que puede desaparecer durante el ciclo de vida de su aplicación.
Hice un proyecto de demostración para mostrar cómo hacer esto.
Aquí hay un resumen rápido de lo que debe suceder:
Necesita crear una subclase de
UIApplication
. Cuando la documentación diceUIResponder
, significaUIApplication
, ya que su clase de aplicación es una subclase deUIResponder
. En esta subclase, vas a implementar losremoteControlReceivedWithEvent:
ycanBecomeFirstResponder
. Desea devolverYES
desdecanBecomeFirstResponder
. En el método de control remoto, es probable que desee notificar a su reproductor de audio que algo ha cambiado.Necesita decirle a iOS que use su clase personalizada para ejecutar la aplicación, en lugar de la aplicación
UIApplication
predeterminada. Para hacerlo, abra main.m y cambie esto:return UIApplicationMain(argc, argv, nil, NSStringFromClass([RCAppDel`egate class]));
para que se vea así:
return UIApplicationMain(argc, argv, NSStringFromClass([RCApplication class]), NSStringFromClass([RCAppDelegate class]));
En mi caso,
RCApplication
es el nombre de mi clase personalizada. Use el nombre de su subclase en su lugar. No te olvides de#import
el encabezado apropiado.OPCIONAL: debe configurar una sesión de audio. No es necesario, pero si no lo hace, el audio no se reproducirá si el teléfono está silenciado. Lo hago en el delegado de la aplicación de demostración, pero lo hago cuando sea apropiado.
Toca algo. Hasta que lo haga, los controles remotos ignorarán su aplicación. Acabo de tomar un
AVPlayer
y le di el URL de un sitio de transmisión que espero que esté activo. Si encuentra que falla, coloque su propia URL allí y juegue con ella para su contenido.
Este ejemplo tiene un poco más de código para desconectar los eventos remotos, pero no es tan complicado. Solo defino y paso algunas constantes de cadena.
Apuesto a que un archivo MP3 en bucle silencioso te ayudaría a alcanzar tu objetivo.