Uso de beginReceivingRemoteControlEvents

Vi a gente usar: [[UIApplication shanetworkingApplication] beginReceivingRemoteControlEvents]; para manejar el evento de control remoto cuando se administra la session de audio.

Mi pregunta:

¿Este código solo se puede usar en una class UIViewController o en la class AppDelegate ? Porque veo a todos en Internet usándolo en una de las dos classs. ¿Puedo usarlo en una class que no sea una subclass de UIViewController o AppDelegate?

Para las aplicaciones que solo quieren manejar events de control remoto mientras están en un estado determinado, listo para reproducir medios, por ejemplo, en lugar de estar en la configuration o pantalla de logging, invocar a beginReceivingRemoteControlEvents desde un controller de vista tiene cierta cantidad de sentido. Es posible que otras aplicaciones deseen suprimir por completo el comportamiento del control remoto (porque se hacen cargo de la session de audio y no quieren que el usuario active el audio de background y corrompe los datos de la session).

Sin embargo, no hay nada que te impida include ese comportamiento en otra área de la aplicación, especialmente si se comparte. beginReceivingRemoteControlEvents es un método en UIApplication , por lo que siempre que pueda get un identificador de [UIApplication shanetworkingApplication] , puede marcar la aplicación para comenzar / finalizar el event handling events de control remoto.

Sin embargo, vale la pena señalar que el método está en desuso:

En iOS 7.1 y posterior, use el object compartido MPRemoteCommandCenter para registrarse para events de control remoto. No necesita llamar a este método cuando usa el object central de command compartido. [ 1 ]

Mi experiencia con el event handling events de control remoto tiene un par de años de antigüedad en este punto, pero recuerdo que hubo un comportamiento no intuitivo relacionado con beginReceivingRemoteControlEvents . Una mirada rápida a MPRemoteCommandCenter hace que esto parezca una mejor API para manejar events de control remoto. Si sus casos de uso no requieren compatibilidad con iOS 7.0, debe investigar esa API.

[[UIApplication shanetworkingApplication] beginReceivingRemoteControlEvents]; puede usarse en cualquier punto de su aplicación, como justo antes de iniciar la reproducción de audio, o al application:didFinishLaunchingWithOptions: en la application:didFinishLaunchingWithOptions: delegate method.

Para las aplicaciones que desean utilizar los controles para la reproducción de audio en segundo plano durante todo el ciclo de vida de la aplicación (y en segundo plano), recomiendo llamar a beginReceivingRemoteControlEvents en su AppDelegate. De esta forma, está explícitamente preparado para recibir events de control remoto en cualquier momento durante el ciclo de vida de la aplicación.

Palpatim mencionó MPRemoteCommandCenter . Como alguien que ha creado una aplicación completa en torno a la reproducción de audio de background (piense en la radio), recomiendo este método sobre las viejas UIEvent llamada de UIEvent . Me sumerjo en este enfoque en otra respuesta , pero la esencia es usar MPRemoteCommandCenter.shanetworkingCommandCenter() para habilitar o deshabilitar los controles de reproducción en la pantalla de locking y el centro de control, además de proporcionar selectores:

 let commandCenter = MPRemoteCommandCenter.shanetworkingCommandCenter() commandCenter.previousTrackCommand.enabled = true; commandCenter.previousTrackCommand.addTarget(self, action: #selector(previousTrack)) commandCenter.nextTrackCommand.enabled = false commandCenter.nextTrackCommand.addTarget(self, action: #selector(nextTrack)) 

Tenga en count que si desea deshabilitar explícitamente los controles, debe proporcionar un selector [ficticio] para la acción, además de la configuration enabled = false en el command.

Para abordar su punto sobre becomeFirstResponder :

Cualquier object que se henetworkinga de UIResponder, como un UIViewController o el UIApplicationDelegate puede convertirse en el primer respondedor, siempre que ese object implemente el método requerido remoteControlReceivedWithEvent: para manejar los events de control remoto. Por ejemplo, podría hacer que el AppDelegate se convierta en el primer respondedor y maneje todos los events de control remoto allí, y envíe notifications que UIViewController un UIViewController para pausar el reproductor o saltar a la siguiente pista. Puede hacer que un UIViewController convierta en el primer respondedor (el controller que tenga una reference al jugador) y controle directamente al jugador. La architecture es bastante abierta y realmente depende de cómo estructuró su aplicación. No ha proporcionado ningún código, así que no sé cómo se ve la configuration de su reproductor.

Su código de manejo UIResponder probablemente se verá algo como esto:

 - (void)remoteControlReceivedWithEvent:(UIEvent *)event { if (event.type == UIEventTypeRemoteControl) { switch (event.subtype) { case UIEventSubtypeRemoteControlTogglePlayPause: // Pause or play action break; case UIEventSubtypeRemoteControlNextTrack: // Next track action break; case UIEventSubtypeRemoteControlPreviousTrack: // Previous track action break; case UIEventSubtypeRemoteControlStop: // Stop action break; default: // catch all action break; } } } 

Nuevamente, depende de usted si coloca esto en un controller o en su AppDelegate.

¿Puedo usarlo en una class que no sea una subclass de UIViewController o AppDelegate?

Sí, implementa esto en cualquier class que henetworkinge de UIResponder . La gente normalmente usa AppDelegate o un controller de vista para mayor comodidad.