2010-07-01 23 views
18

La documentazione è piuttosto mal scritto quando si parla di riproduzione audio in background. Dà l'impressione che tutto quello che dovete fare per continuare a giocare l'audio che si sta giocando è quello di aggiungere solo una coppia chiave/valore al file info.plist e wallah, è magia.Entrando background su iOS4 per riprodurre audio

Tuttavia, questo non è il caso. Ad esempio, se suono un mp3 della durata di 2 minuti, ovviamente l'audio è abbastanza lungo da poter essere riprodotto dopo aver premuto il tasto home per inviare la mia app sullo sfondo. La cosa è, anche se ho quella coppia chiave/valore nel mio file info.plist, mette in pausa l'audio e poi riprende a giocare una volta che torno all'app.

Apple afferma che tutti i framework per il supporto audio in background e il suono dovrebbero continuare a riprodursi fino al punto in cui finisce e quindi Apple sospenderà la tua app.

Quindi, la mia domanda è: Cosa stanno facendo che mi manca? Devo anche usare i loro nuovi delegati in qualche modo o chiamare l'audio sullo applicationDidEnterBackground? Per me, questo non avrebbe senso dato che non sto salvando lo stato (lo fanno per me con la commutazione rapida delle app) o gestendo veramente qualcosa sullo sfondo che non sia l'audio, che si dice debba essere gestito automaticamente.

+0

lol @ "wallah". voilà :) – h4xxr

+0

scusa, ho preso lezioni di spelling da Dan Quayle :) – iwasrobbed

risposta

17

Quella parte mancante dalla documentazione è è necessario impostare la sessione audio.

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

Aggiungi questo e sarai a posto.

+0

Questa dovrebbe essere la risposta. –

+0

Almeno qualcuno lo realizza! :) –

+0

Josh, stavi prendendo il segno di spunta, non preoccuparti :) Ha funzionato come un incantesimo. stackoverflow stava rovinando la mia rete lenta, quindi ho dovuto chiudere il browser per correggerlo. – iwasrobbed

22

È inoltre necessario effettuare chiamate a beginBackgroundTaskWithExpirationHandler: prima di avviare un brano (eseguirlo tutto il tempo in primo piano oppure no) e endBackgroundTask quando finisce.

Questo dice iOS che si desidera essere in grado di continuare l'elaborazione, anche se la vostra applicazione viene messo in background. Non crea una nuova attività o thread, è solo una bandiera per iOS che si desidera mantenere in esecuzione. L'audio verrà riprodotto fino alla fine senza questo, ma quando si completa se vuoi iniziare un'altra traccia devi essere in grado di eseguire in background.

Si può usare in questo modo:

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

Quando si avvia un lettore audio che salvare l'ID bg compito:

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

Ora l'audioPlayerDidFinishPlaying: callback si verificherà ancora perché abbiamo detto iOS che stiamo svolgendo un'attività che deve continuare anche se veniamo messi in secondo piano. In questo modo otteniamo il callback e possiamo avviare il prossimo file audio.

- (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; 
}  
+0

Perché dovresti iniziare un'attività in background solo per riprodurre l'audio. Questo non è affatto necessario. –

+0

Pensi che questo lo manterrà in vita solo per il tempo che Apple assegna quando richiedi 'beginBackgroundTaskWithExpirationHandler 'o continuerà a suonare finché usi' audioDidFinishPlaying' per riprodurre un suono o riprodurre un nuovo suono? – iwasrobbed

+0

+1 a progrmr per andare al di sopra e al di là dal momento che avrò davvero bisogno anche di quello che sto facendo (non so perché qualcuno ti ha downvoted, ma apprezzo la tua risposta) – iwasrobbed

Problemi correlati