Inserindo plano de fundo no iOS4 para reproduzir áudio

A documentação é mal escrita quando se fala em reproduzir áudio em segundo plano. Dá a impressão de que tudo o que você precisa fazer para continuar reproduzindo o áudio que está tocando atualmente é simplesmente adicionar um par chave / valor ao arquivo info.plist e ao wallah, é mágico.

No entanto, este não é o caso. Por exemplo, se eu tocar um mp3 com 2 minutos de duração, obviamente o áudio é longo o suficiente para poder tocar depois que eu apertar o botão home para enviar meu aplicativo para o segundo plano. O problema é que, apesar de eu ter esse par de chave / valor no meu arquivo info.plist , ele pausa o áudio e retoma a reprodução quando eu voltar para o aplicativo.

A Apple afirma que todos os frameworks para suporte de áudio em segundo plano e o som devem continuar sendo reproduzidos até o ponto em que ele termina e, em seguida, a Apple suspenderá seu aplicativo.

Então, minha pergunta é: o que eles estão fazendo que eu estou perdendo? Eu também tenho que usar seus novos representantes de alguma forma ou ligar para o áudio no applicationDidEnterBackground ? Para mim, isso não faria sentido, já que não estou salvando o estado (eles fazem para mim com a rápida troca de aplicativos) ou realmente manipulando qualquer coisa em segundo plano, além do áudio, que eles dizem que deve ser manipulado automaticamente.

A única parte que falta na documentação é que você precisa definir sua session de áudio.

 [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; 

Adicione isso e você será bom para ir.

Você também precisa fazer chamadas para beginBackgroundTaskWithExpirationHandler: antes de iniciar uma música (faça isso o tempo todo, em primeiro plano ou não) e endBackgroundTask quando terminar.

Isso diz ao iOS que você deseja continuar o processamento mesmo que seu aplicativo seja colocado em segundo plano. Ele não cria uma nova tarefa ou thread, é apenas um sinalizador para o iOS que você deseja continuar executando. O áudio será reproduzido até a conclusão sem isso, mas quando ele for concluído se você quiser iniciar outra faixa, será possível executá-lo em segundo plano.

Você pode usá-lo assim:

 // ivar, initialized to UIBackgroundTaskInvalid in awakeFromNib UIBackgroundTaskIdentifier bgTaskId; 

Ao iniciar um reprodutor de áudio, salvamos o id da tarefa bg:

 if ([audioPlayer play]) { bgTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL]; } 

Agora, o retorno de chamada de audioPlayerDidFinishPlaying: ainda ocorrerá porque informamos ao iOS que estamos realizando uma tarefa que precisa continuar, mesmo que seja colocado em segundo plano. Dessa forma, recebemos o retorno de chamada e podemos iniciar o próximo arquivo de áudio.

 - (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)success { UIBackgroundTaskIdentifier newTaskId = UIBackgroundTaskInvalid; if (self.haveMoreAudioToPlay) { newTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL]; [self playNextAudioFile]; } if (bgTaskId != UIBackgroundTaskInvalid) { [[UIApplication sharedApplication] endBackgroundTask: bgTaskId]; } bgTaskId = newTaskId; } 
    Intereting Posts