2013-04-26 10 views
6

Pracuję nad małą aplikacją, w której chcę, aby telefon odtwarzał plik dźwiękowy z wydarzenia z kontrolera lokalizacji. Problem polega na tym, że aplikacja jest w trybie tła, a AVAudioPlayer nie uruchamia pliku audio, ale kod jest zaplanowany, uzyskując wyjście NSLog. Inną rzeczą jest to, że działa w symulatorze, ale nie w telefonie.IOS: Odtwarzaj dźwięk, gdy aplikacja jest w tle.

Co nie?

To jest mój kod, aby odtworzyć plik:

- (void)tryPlayTaleSound:(NSString*)fileName { 

    NSString *backgroundMusicPath = [[NSBundle mainBundle] pathForResource:fileName ofType:@"mp3"]; 
    NSURL *backgroundMusicURL = [NSURL fileURLWithPath:backgroundMusicPath]; 
    NSError *error; 

    backgroundMusicPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:backgroundMusicURL error:&error]; 

    // Check to see if iPod music is already playing 
    //UInt32 propertySize = sizeof(otherMusicIsPlaying); 
    //AudioSessionGetProperty(kAudioSessionProperty_OtherAudioIsPlaying, &propertySize, &otherMusicIsPlaying); 

    // Play the music if no other music is playing and we aren't playing already 
    //if (otherMusicIsPlaying != 1 && !backgroundMusicPlaying) { 
    //[backgroundMusicPlayer prepareToPlay]; 
    [backgroundMusicPlayer play]; 
    backgroundMusicPlaying = YES; 
    //} 
    NSLog(@"%s - ", __FUNCTION__); 
} 

W dzienniku Im coraz to.

Apr 26 13:57:48 iPhone CommCenter[58] <Notice>: Client [com.apple.persistentconnection[dataaccessd,85]] is telling PDP context 0 to go active. 
Apr 26 13:57:50 iPhone Herning100[1467] <Warning>: Playing audiofile - filename is Fil03 
Apr 26 13:57:50 iPhone mediaserverd[39] <Warning>: 13:57:50.653 <AudioControl> WARNING translating CMSession error: -12985 
Apr 26 13:57:50 iPhone mediaserverd[39] <Warning>: 13:57:50.656 <AudioControl> WARNING translating CMSession error: -12985 
Apr 26 13:57:50 IPhone mediaserverd[39] <Error>: 13:57:50.734 <AudioControl> AudioQueue: Error -12985 from AudioSessionSetClientPlayState(1467) 
Apr 26 13:57:50 iPhone Herning100[1467] <Warning>: -[AppDelegate tryPlayTaleSound:] - 
Apr 26 13:57:50 iPhone com.apple.debugserver-199[1465] <Warning>: 9 +28.832083 sec [05b9/0303]: error: ::mach_vm_region_recurse (task = 0x1603, address => 0xfffffffe, size => 0, nesting_depth => 1024, info => 0x2fd7fe48, infoCnt => 12) addr = 0xfffffffe err = (os/kern) invalid address (0x00000001) 
Apr 26 13:57:51 iPhone com.apple.debugserver-199[1465] <Warning>: 10 +0.187961 sec [05b9/0303]: error: ::mach_vm_region_recurse (task = 0x1603, address => 0xfffffffe, size => 0, nesting_depth => 1024, info => 0x2fd7fe48, infoCnt => 12) addr = 0xfffffffe err = (os/kern) invalid address (0x00000001) 

Czy jest jakaś różnica, jeśli używam AVAudioPlayer lub AVAudioSession?

Mam nadzieję, że ktoś może pomóc.

/Lasse

+0

Mam nadzieję, że ten link może ci pomóc. http://stackoverflow.com/questions/6785925/how-to-playing-audio-in-background-mode-when-if-i-click-on-iphone-button-to-min – rir

Odpowiedz

0

iOS tylko niektóre aplikacje mogą być uruchamiane w tle. Jedną z nich jest aplikacja odtwarzacza audio, ale dla nich należy ustawić "wymagane tryby tła" z "audio" (aplikacja może odtwarzać dźwięk) na liście Info.plist.

I tak, jeśli jesteś w stanie uzyskać położenie w tle, musisz ustawić ten klucz na swojej liście. Dodaj również uprawnienie audio do pliku plist.

+0

Dzięki, ale ja właściwie ustawić położenie i dźwięk w pliku Plist. Jeśli dźwięk zostanie uruchomiony podczas uruchamiania aplikacji, nie kontynuuj odtwarzania po zminimalizowaniu aplikacji. Ale kiedy ten dźwięk zostanie zrobiony, nigdy nie rozpocznie nowego dźwięku w tle. – lskov

9

Oprócz posiadania tryb tła audio w swojej Info.plist trzeba ustawić współdzielony sesji audio do prawidłowego trybu dla swojej aplikacji i aktywować go tuż przed odtwarzanie dźwięku w tle:

AVAudioSession *audioSession = [AVAudioSession sharedInstance]; 
NSError *error = nil; 
NSLog(@"Activating audio session"); 
if (![audioSession setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionDuckOthers error:&error]) { 
    NSLog(@"Unable to set audio session category: %@", error); 
} 
BOOL result = [audioSession setActive:YES error:&error]; 
if (!result) { 
    NSLog(@"Error activating audio session: %@", error); 
} 
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 

Don” t zapomnij wyłączyć sesję audio po zakończeniu odtwarzania dźwięków:

AVAudioSession *audioSession = [AVAudioSession sharedInstance]; 
NSError *error = nil; 
NSLog(@"Deactivating audio session"); 
BOOL result = [audioSession setActive:NO error:&error]; 
if (!result) { 
    NSLog(@"Error deactivating audio session: %@", error); 
} 
+0

OP: Robię dokładnie to samo, co ty i to rozwiązanie działa idealnie. Mam inny kod, do którego to dodałem, więc jeśli to nie zadziała, daj mi znać, a ja mogę podzielić się tym, co zrobiłem, aby działał ontop tego, co już napisał glebd. –

+0

dzięki, muszę ustawić kategorię na "AVAudioSessionCategoryPlayback", aby odtwarzać dźwięk, gdy aplikacja jest w tle. –

0

Przed rozpoczęciem odtwarzania dźwięku w tle skonfiguruj zadanie w tle. Wygląda na to, że iOS nie chce uruchomić dźwięku w tle, jeśli pozostały czas tła jest krótszy niż 10 sekund.