IOS:在后台播放声音

我正在一个小应用程序,我想要手机播放来自我的位置控制器的事件的声音文件。 问题是,当应用程序处于后台模式时,AVAudioPlayer不启动audio文件,但代码已经调度,获得NSLog输出。 另一件事是它在模拟器,但不是在手机上。

不是吗?

这是我的代码来播放文件:

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

在日志我得到这个。

 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或AVAudioSession,是否有区别?

希望有人能帮忙。

/拉塞

除了Info.plist中的背景模式audio ,您还需要将共享audio会话设置为适用于您的应用的正确模式,并在后台播放声音之前将其激活:

 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]; 

当您完成播放声音时,请不要忘记closuresaudio会话:

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

在开始在后台播放声音之前,请设置后台任务。 如果剩余的背景时间less于10秒,iOS似乎拒绝在后台启动声音。

在iOS上,只有一些应用程序被允许在后台运行。 其中之一是audio播放器的应用程序,但他们需要在Info.plist中设置“所需的背景模式”与“audio”(应用程序可以播放audio)。

是的,如果你能够在后台获得位置,那么你必须在你的Plist中设置这个键。 在plist中添加audio许可。