2012-06-04 15 views
9

Aquí hay información general, 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.Reciba eventos de control remoto sin audio

Mi primera inclinación es hacer que la aplicación reproduzca un clip silencioso cada vez que se abra para poder 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 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?

P.S. Preferiría tener esta funcionalidad en iOS 4.0 y posteriores.

P.P.S He visto this similar question y me ha dado una lluvia de ideas, pero la respuesta proporcionada no es específica de lo que necesito saber.

Respuesta

25

NOTA: A partir de iOS 7.1, usted debe utilizar MPRemoteCommandCenter en lugar de la respuesta a continuación.

Crea varias subclases proporcionadas por el sistema de MPRemoteCommand y asígnelas a las propiedades del [MPRemoteCommandCenter sharedCommandCenter].

Guardo el resto de esto como referencia histórica, pero no se garantiza que lo siguiente funcione en versiones recientes de iOS. De hecho, es posible que no.


que definitivamente necesita un audio jugador pero no necesariamente una sesión explícitaa tomar el control de los eventos de control remoto. (AVAudioSession es implícita a cualquier aplicación que reproduce audio.) Pasé una buena cantidad de tiempo jugando con esto para confirmar esto.

he visto mucha confusión en Internet sobre dónde establecer los removeControlEventRecievedWithEvent: método y los diversos enfoques de 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 a demo project para mostrar cómo hacerlo.

Aquí está un resumen rápido de lo que tiene que suceder:

  1. Es necesario crear una subclase de UIApplication. Cuando la documentación dice UIResponder, significa UIApplication, ya que su clase de aplicación es una subclase de UIResponder. En esta subclase, implementará los métodos remoteControlReceivedWithEvent: y canBecomeFirstResponder. Desea devolver YES desde canBecomeFirstResponder. En el método de control remoto, es probable que desee notificar a su reproductor de audio que algo ha cambiado.

  2. Necesita decirle a iOS que use su clase personalizada para ejecutar la aplicación, en lugar del UIApplication predeterminado. Para ello main.m así, abierta y cambiar esta situación:

    return UIApplicationMain(argc, argv, nil, NSStringFromClass([RCAppDel`egate class])); 
    

    a tener este aspecto:

    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 se olvide de #import el encabezado apropiado.

  3. 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.

  4. Juega 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 de bucle silencioso te ayudaría a alcanzar tu objetivo.

+0

¡Guau, gracias! Veré la demostración cuando llegue a casa. Ahora dices que la metodología aquí funciona en iOS 6 & 7; ¿conoces la parte superior de tu cabeza si se remonta a 5.1? – Squatch

+0

No estoy seguro, pero creo que los cambios fueron entre iOS 6 y 7, así que me imagino que funciona en iOS 5. – Moshe

+1

Acabo de cargar mi iPad con iOS 5 e intenté ejecutar la demostración en eso. Al principio no funcionaría, pero si desactivas el autolayout y la función de localización de iOS 6+ (y copias de nuevo el plumillo no localizado) funciona en su mayoría. Digo principalmente porque algo está mal con el botón Reproducir/Pausa. (Creo que es solo un tipo de evento que no contabilicé correctamente. Ejecútalo y verás lo que quiero decir.) – Moshe

1

¡La solución de Moshe funcionó muy bien para mí! 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, entonces esto no sucederá:

NSDictionary *mediaInfo = @{MPMediaItemPropertyTitle: @"My Title", 
           MPMediaItemPropertyAlbumTitle: @"My Album Name", 
           MPMediaItemPropertyPlaybackDuration: [NSNumber numberWithFloat:0.30f]}; 
[[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:mediaInfo]; 
Cuestiones relacionadas