iphone - sea - iOS 4: controles remotos para audio de fondo
no puedo poner musica de itunes en imovie (7)
El segundo método no funcionó para mí, nunca se llamó a sendEvent
. Sin embargo, el primer método funcionó muy bien (subclassing UIWindow
).
Actualmente estoy intentando configurar audio de fondo para una aplicación que estoy desarrollando para iOS 4. La aplicación no tiene un reproductor de música dedicado viewController
, sin embargo, a diferencia de otras aplicaciones de audio de fondo como Pandora, que hace que la tarea sea un poco más confuso
Establecí la configuración apropiada de Info.plist
correctamente y tengo un objeto AVAudioPlayer
en el delegado de mi aplicación al que se puede acceder desde cualquier lugar. Cuando el usuario reproduce una canción, sustituyo el AVAudioPlayer
por uno nuevo inicializado con la canción y lo reproduzco. Todo esto funciona muy bien, excepto que ahora no tengo idea de cómo apoyar los eventos de control remoto.
De acuerdo con la documentación de Apple, tengo esto:
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
[self becomeFirstResponder];
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[[UIApplication sharedApplication] endReceivingRemoteControlEvents];
[self resignFirstResponder];
}
- (BOOL)canBecomeFirstResponder {
return YES;
}
- (void)remoteControlReceivedWithEvent:(UIEvent *)event {
switch(event.subtype) {
case UIEventSubtypeRemoteControlTogglePlayPause:
if([iPhoneAppDelegate backgroundAudioPlayer].playing)
[iPhoneAppDelegate pauseBackgroundAudioPlayer];
else
[iPhoneAppDelegate playBackgroundAudioPlayer];
break;
}
}
La cuestión es, ¿dónde pongo esto? La documentación de Apple parece sugerir que esto debería ir en algún controlador de visualización en alguna parte, pero mi aplicación tiene muchos controladores de vista y controladores de navegación. Siempre que trato de poner esto, por alguna razón tocar el botón Activar / Pausa en los controles remotos de la bandeja multitarea hace que la canción simplemente haga una pausa por un momento y luego reanude, o de alguna manera haga que la canción se reproduzca dos veces.
Encontré un par de soluciones para recibir eventos de control remoto global en los foros de desarrolladores de Apple después de un poco de búsqueda.
Una forma es subclase UIWindow
y anular su remoteControlReceivedWithEvent:
La segunda, quizás más bonita, es subclase UIApplication
y anular sendEvent:
De esta forma, puede interceptar todos los eventos de control remoto y manejarlos allí globalmente, y no tener ningún otro respondedor que los maneje más adelante en la cadena de respuesta.
- (void)sendEvent:(UIEvent *)event {
if (event.type == UIEventTypeRemoteControl) {
// Handle event
}
else
[super sendEvent:event];
}
La documentación lo explica muy bien. https://developer.apple.com/library/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/Remote-ControlEvents/Remote-ControlEvents.html
Los ejemplos de documentación son un poco engañosos, pero no hay necesidad de subclasificar nada en ninguna parte. El lugar correcto para poner remoteControlReceivedWithEvent: está en el delegado de la aplicación, ya que permanece en la cadena de respuesta independientemente de si la aplicación está en primer plano o no. Además, los eventos de control remoto de inicio / finalización deben basarse en si realmente necesita los eventos, no en la visibilidad de alguna vista aleatoria.
Luché con este por un tiempo y ninguna de las respuestas anteriores funcionó. El error en mi código, y espero que ayude a alguien a leer esto, fue que tenía el AudioSession configurado para mezclarlo con otros. Desea ser el reproductor de audio en primer plano para obtener eventos de control remoto. Verifique si tiene un código INCORRECTO como este:
[[AVAudioSession sharedInstance] setDelegate: self];
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: nil];
UInt32 doSetProperty = 0;
AudioSessionSetProperty (
kAudioSessionProperty_OverrideCategoryMixWithOthers,
sizeof (doSetProperty),
&doSetProperty
);
NSError *activationError = nil;
[[AVAudioSession sharedInstance] setActive: YES error: &activationError];
Y elimine AudioSessionSetProperty, o cambie doSetProperty a 1.
No es necesario subclasar eventos de Ventana o reenviar. Simplemente maneja desde tu controlador de vista principal. Consulte el ejemplo del Mezclador de audio (MixerHost) para obtener más información.
Una cosa que parece influir en este comportamiento es cualquier opción de categoría que establezca para su AVAudioSession usando setCategory: withOptions: error: en lugar de simplemente setCategory: error :. En particular, a partir de la prueba y error, parece que si configura AVAudioSessionCategoryOptionMixWithOthers no obtendrá eventos de control remoto; los controles que se están reproduciendo todavía controlarán la aplicación iPod. Si configura AVAudioSessionCategoryOptionDuckOthers obtendrá eventos de control remoto, pero parece que puede haber cierta ambigüedad con respecto a qué aplicación se controla. Configurando categoryOptions a 0 o simplemente llamando a setCategory: error: funciona mejor.