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; }