2013-04-26 29 views
6

Telefonun, konum denetleyicimden gelen bir etkinlikte bir ses dosyasını oynatmasını istediğim küçük bir uygulama üzerinde çalışıyorum. Sorun, Uygulama Arka Plan modundayken AVAudioPlayer'ın Ses dosyasını başlatmaması, ancak kodun NSLog çıktısını alması zamanlamasıdır. Başka bir şey, simülatörde çalışıyor, ancak telefonda çalışmıyor.IOS: Arka planda uygulamadayken sesi çalın

Neden değil? Im Bu alma günlüğünde

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

:

Bu

dosyayı oynamak benim koddur.

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) 

AVAudioPlayer veya AVAudioSession'ı kullanırsam bir fark var mıdır?

Birisi yardımcı olabilir umarım. iOS'da

/Lasse

+0

Umarım bu bağlantı size yardımcı olabilir. http://stackoverflow.com/questions/6785925/how-to-playing-audio-in-background-mode-when-if-i-click-on-iphone-button-to-min – rir

cevap

0

sadece bazı uygulamaların arka planda çalışmasına izin verilir. Bunlardan biri Audio player uygulamasıdır, ancak onlar için Info.plist'inizde "audio" (App ses çalabilir) ile "gerekli arkaplan modlarını" ayarlamanız gerekir.

Ve eğer Konum'u Arkaplanda'ya alabiliyorsanız Evet, bu anahtarı Plist'inize ayarlamanız gerekir. Ayrıca plisteki ses iznini de ekleyin.

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': arka plan modu audio sahip senin Info.plist uygulamanız için doğru moda paylaşılan ses oturumu ayarlamak gerekir ve sadece arka planda ses oynamadan önce aktive ek olarak

+0

Teşekkürler ama aslında Plist dosyasında Yer ve Ses ayarlarına sahip olursunuz. Uygulama çalışırken bir ses başlatılırsa, Uygulamayı simge durumuna küçültmeden sonra oynatmaya devam edemezsiniz. Fakat bu ses bittiğinde, yeni sesi arka plan modunda asla başlatmaz. – lskov

9

t oynamaya sesler bittiğinde ses oturumu devre dışı bırakmak için unutmak:

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: Sizinle aynı şeyi yapıyorum ve bu çözüm mükemmel bir şekilde çalıştı. Bunu eklediğim başka bir kodum var, bu yüzden eğer bu işe yaramazsa bana haber verin ve glebd'in ne yazdığına karar vermek için yaptığım şeyi paylaşabiliyorum. –

+0

teşekkürler, app arka planda olduğunda ses çalmak için kategoriyi "AVAudioSessionCategoryPlayback" olarak ayarlamanız gerekiyor. –

0

arka plan görevi kurmak, arka planda bir ses çalma başlamadan önce. Geriye kalan arka plan süresi 10 saniyeden azsa iOS'un arka planda bir ses başlatmayı reddettiği görülüyor.

İlgili konular