2010-07-01 20 views
18

Dokumentacja jest raczej słabo napisana, gdy mówimy o odtwarzaniu dźwięku w tle. Wydaje się, że wszystko, co musisz zrobić, aby kontynuować odtwarzanie dźwięku, który właśnie grasz, to po prostu dodać parę klucz/wartość do pliku info.plist i wallah, to jest magia.Wprowadzanie tła w systemie iOS4 do odtwarzania dźwięku

Jednak tak nie jest. Na przykład, jeśli odtwarzam plik MP3 trwający 2 minuty, oczywiście dźwięk jest wystarczająco długi, aby odtwarzać go po naciśnięciu przycisku strony głównej, aby wysłać aplikację na miejsce. Rzecz w tym, że mimo że mam parę kluczy/wartości w moim pliku info.plist, wstrzymuje ona odtwarzanie dźwięku, a następnie wznawia odtwarzanie po przełączeniu z powrotem do aplikacji.

Apple twierdzi, że wszystkie struktury tła dźwięku i dźwięku powinny być odtwarzane do momentu, w którym się zakończy, a następnie Apple zawiesi twoją aplikację.

Moje pytanie brzmi: co oni robią, czego mi brakuje? Czy muszę też w jakiś sposób korzystać z nowych osób lub dzwonić do audio na applicationDidEnterBackground? Dla mnie to nie ma sensu, ponieważ nie oszczędzam stanu (robią to dla mnie z szybkim przełączaniem aplikacji) lub naprawdę obsługuję wszystko w tle inne niż audio, które według nich ma być obsługiwane w sposób automatyczny.

+0

lol @ "wallah". voila :) – h4xxr

+0

Przepraszam, wziąłem lekcje pisowni od Dan Quayle :) – iwasrobbed

Odpowiedz

17

Jedna część brakująca w dokumentacji to konieczność ustawienia sesji audio.

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

Dodaj to i będziesz gotowy do pracy.

+0

To powinno być odpowiedzią. –

+0

Przynajmniej ktoś to rozumie! :) –

+0

Josh, dostałeś znacznik wyboru, nie martw się :) To działało jak czar. Stackoverflow zepsuł moją powolną sieć, więc musiałem zamknąć przeglądarkę, żeby to poprawić. – iwasrobbed

22

Musisz również wykonać połączenia z beginBackgroundTaskWithExpirationHandler: przed rozpoczęciem utworu (czy to cały czas, czy na pierwszym planie, czy nie) i endBackgroundTask po jego zakończeniu.

To mówi iOS, że chcesz móc kontynuować przetwarzanie, nawet jeśli aplikacja zostanie umieszczona w tle. Nie tworzy nowego zadania lub wątku, jest tylko flagą do iOS, którą chcesz nadal używać. Dźwięk zostanie odtworzony do końca bez tego, ale gdy zakończy się, jeśli chcesz rozpocząć kolejny utwór, musisz być w stanie uruchomić się w tle.

Można go używać tak:

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

Po uruchomieniu odtwarzacza audio możemy zapisać identyfikator bg zadanie:

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

Teraz audioPlayerDidFinishPlaying: zwrotna będzie nadal występować, ponieważ mówiliśmy iOS że wykonujemy zadanie, które musi być kontynuowane, nawet jeśli zostaniemy zepchnięci w cień. W ten sposób otrzymamy wywołanie zwrotne i możemy rozpocząć następny plik 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

Dlaczego miałbyś rozpocząć zadanie w tle po to, aby odtwarzać dźwięk? To wcale nie jest konieczne. –

+0

Czy sądzisz, że to utrzymałoby go przy życiu tylko przez czas, gdy Apple poprosi o "beginBackgroundTaskWithExpirationHandler" lub będzie grało dalej, dopóki używasz 'audioDidFinishPlaying' do zapętlenia dźwięku lub odtwarzania nowego dźwięku? – iwasrobbed

+0

+1 do progrmr za wykraczanie poza to, ponieważ naprawdę będę potrzebował tego również dla tego co robię (nie jestem pewien, dlaczego ktoś cię zawiódł, ale doceniam twoją odpowiedź) – iwasrobbed

Powiązane problemy