ios objective-c audio avaudioplayer uievent

ios - ¿Por qué desaparecen los controles de audio de la pantalla de bloqueo cuando hago una pausa en AVAudioPlayer?



objective-c uievent (2)

Estoy usando una instancia de AVAudioPlayer para reproducir un archivo de audio. La aplicación está configurada para reproducir audio en segundo plano y se configura una sesión de audio apropiada. También estoy recibiendo con éxito eventos de control remoto.

Aquí está el código:

#import "ViewController.h" #import <AVFoundation/AVFoundation.h> @interface ViewController () @property (nonatomic) AVAudioPlayer *player; @end @implementation ViewController @synthesize player; - (BOOL)canBecomeFirstResponder { return YES; } - (void)viewDidLoad { [super viewDidLoad]; // Turn on remote control event delivery [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; // Set ourselves as the first responder [self becomeFirstResponder]; // Set the audio session AVAudioSession *audioSession = [AVAudioSession sharedInstance]; NSError *setCategoryError = nil; BOOL success = [audioSession setCategory:AVAudioSessionCategoryPlayback error:&setCategoryError]; NSError *activationError = nil; success = [audioSession setActive:YES error:&activationError]; // Play an mp3 with AVAudioPlayer NSString *audioFileName = @"%@/Via_Aurora.mp3"; NSURL *audioURL = [NSURL fileURLWithPath:[NSString stringWithFormat:audioFileName, [[NSBundle mainBundle] resourcePath]]]; player = [[AVPlayer alloc] initWithURL:audioURL]; [player play]; } - (void)viewWillDisappear:(BOOL)animated { // Turn off remote control event delivery & Resign as first responder [[UIApplication sharedApplication] endReceivingRemoteControlEvents]; [self resignFirstResponder]; // Don''t forget to call super [super viewWillDisappear:animated]; } - (void)remoteControlReceivedWithEvent:(UIEvent *)receivedEvent { if (receivedEvent.type == UIEventTypeRemoteControl) { switch (receivedEvent.subtype) { case UIEventSubtypeRemoteControlPreviousTrack: NSLog(@"prev"); break; case UIEventSubtypeRemoteControlNextTrack: NSLog(@"next"); break; case UIEventSubtypeRemoteControlPlay: [player play]; break; case UIEventSubtypeRemoteControlPause: [player pause]; break; default: break; } } } @end

Cuando ejecuto la aplicación, el audio se reproduce cuando se carga la vista. La aplicación continúa reproduciendo audio cuando entra en modo de fondo. Soy capaz de pausar y / o reproducir audio con éxito desde el Centro de Control (se accede desde dentro de la aplicación o desde la Pantalla de bloqueo), pero si accedo a los controles de audio de la Pantalla de bloqueo y hago una pausa en el reproductor, la música se detiene y el control desaparecer. Espero que la música se detenga, pero no que desaparezcan los controles.

En otras aplicaciones de audio que uso, puede pausar, luego reproducir, audio desde la pantalla de bloqueo. ¿He pasado por alto algo? ¿Es este un enfoque correcto para hacer algo como esto?


Agregue este código en ViewDidLoad () para la reproducción de fondo. Funciona para mi Deberías probarlo

UIApplication.sharedApplication().beginReceivingRemoteControlEvents() let session:AVAudioSession = AVAudioSession.sharedInstance() do { try session.setCategory(AVAudioSessionCategoryPlayback) } catch { print("Background Play Error") }


Estás en el camino correcto ...

Parece que te estás perdiendo la configuración;

MPNowPlayingInfoCenter nowPlayingInfo

Sin él, obtendrá los resultados descritos, IE después de presionar pausa, la pantalla de bloqueo ya no muestra la pausa, o incluso que está reproduciendo una canción. Aquí hay una guía sobre cómo configurarlo (he tomado esto del código de trabajo que hice hace un tiempo atrás, pero estoy seguro de que puedes averiguar qué es qué).

MPMediaItemArtwork *artwork = [[MPMediaItemArtwork alloc]initWithImage:albumImage]; [MPNowPlayingInfoCenter defaultCenter].nowPlayingInfo = [NSDictionary dictionaryWithObjectsAndKeys:aSong.songTitle, MPMediaItemPropertyTitle, aSong.artistName, MPMediaItemPropertyArtist, artwork, MPMediaItemPropertyArtwork, 1.0f, MPNowPlayingInfoPropertyPlaybackRate, nil];