2013-04-26 28 views
6

Io lavoro su una piccola app in cui voglio che il telefono riproduca un file audio su un evento dal mio controller di posizione. Il problema è quando l'app è in modalità background, AVAudioPlayer non avvia il file audio ma il codice è pianificato, ottenendo l'output NSLog. Un'altra cosa è che funziona nel simulatore ma non sul telefono.IOS: riproduzione audio mentre l'app in background

Perché no?

Questo è il mio codice per riprodurre il file:

- (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__); 
} 

Nel registro Im ottenendo questo.

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) 

C'è una differenza se utilizzo AVAudioPlayer o AVAudioSession.?

Spero che qualcuno possa aiutare.

/Lasse

+0

Spero che questo collegamento possa aiutarti. http://stackoverflow.com/questions/6785925/how-to-playing-audio-in-back-background-mode-when-if-i-click-on-iphone-button-to-min – rir

risposta

0

Su iOS solo alcune delle applicazioni sono autorizzati per l'esecuzione in background. Uno di questi è l'applicazione Audio player, ma per loro è necessario impostare "modalità di background richieste" con "audio" (l'app può riprodurre audio) nel proprio Info.plist.

E sì, se si è in grado di ottenere la posizione in Background, è necessario aver impostato questa chiave nel proprio Plist. Aggiungi anche il permesso audio nel plist.

+0

Grazie ma in realtà avere sia la posizione che l'audio impostati nel file Plist. Se un audio viene avviato mentre è in esecuzione l'app, non viene riprodotto dopo aver minimizzato l'app. Ma quando questo suono è terminato non inizia mai il nuovo audio in modalità background. – lskov

9

Oltre ad avere modalità background audio nel vostro Info.plist è necessario impostare la sessione audio condiviso per la modalità corretta per la vostra applicazione e attivare appena prima di giocare il vostro suono in sottofondo:

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 dimenticate di disattivare la sessione audio quando avete finito di riprodurre i suoni:

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: Sto facendo esattamente la stessa cosa di te e questa soluzione ha funzionato perfettamente. Ho qualche altro codice a cui ho aggiunto questo, quindi se questo non funziona per te fammelo sapere e posso condividere quello che ho fatto per farlo funzionare su quello che Glebd ha già scritto. –

+0

grazie, ho bisogno di impostare la categoria di "AVAudioSessionCategoryPlayback" per riprodurre l'audio è quando l'app è in background. –

0

Prima di iniziare a riprodurre un suono in background, impostare un'attività in background. Sembra che iOS si rifiuti di avviare un suono in background se il tempo di fondo rimanente è inferiore a 10 secondi.

Problemi correlati