AVAudioPlayer无法在后台播放

我正在使用AVAudioPlayerNSFileHandle来做音频流。 基本思想是我将流式音频数据保存到带有文件系统的设备,然后使用AVAudioPlayer播放刚刚保存的文件。 即使流媒体正在进行中, AVAudioPlayer仍然可以播放该文件。

我有一个UIButton来开始流式传输/下载。 当下载的数据累积到特定数量的字节时, AVAudioPlayer将自动播放(触发AVAudioPlayer的“播放”方法)。 我的问题是:我点击按钮开始流式传输/下载,然后很快按下iPhone的主页按钮,让我的应用程序转到后台。 下载继续在后台工作,但AVAudioPlayer的“播放”方法返回“否”,这意味着“播放”方法不播放音频。

我将AVAudioSession相关代码添加到我的音频播放器的init方法中:

 - (id) initWithURL:(NSString *) downloadedMusicURL { if ((self = [super init])) { [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; CFURLRef url = CFURLCreateWithFileSystemPath (NULL, (CFStringRef)downloadedMusicURL, kCFURLPOSIXPathStyle, FALSE); audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:CFBridgingRelease(url) error:nil]; AVAudioSession *session = [AVAudioSession sharedInstance]; [session setActive:YES error:nil]; [session setCategory:AVAudioSessionCategoryPlayback error:nil]; } return self; } 

同样在info.plist中,我为Key“Required background modes”添加了一个“App播放音频”项。 但是,“播放”仍然无法在后台正确调用。 还有什么我想念的? 非常感谢提前。

您的应用无法在后台播放音频。 这是有道理的。 如果用户没有主动使用的应用程序突然开始产生声音,请想想设备会是什么样子! 请记住,对用户而言,将应用程序发送到后台是相当于退出该应用程序。 你的应用程序不能像僵尸一样从死里复活并开始制造噪音!

背景音频设置允许您在前台生成音频的应用程序在进入后台继续这样做。 然后它可以继续负责音频(如果它接收远程事件),直到其他应用程序产生声音; 之后,您的应用程序将再次运行,直到它被带到前台并产生声音。

因此,如果您希望这样做,您需要应用程序进入后台之前开始播放一些声音。

 [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; UIBackgroundTaskIdentifier newTaskId = UIBackgroundTaskInvalid; newTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL]; 

/ *并在info.Plist文件中所需的背景模式:App PLAYS Audio * /

请在- (void)applicationDidEnterBackground:(UIApplication *)application使用此代码

 UIApplication *app = [UIApplication sharedApplication]; UIBackgroundTaskIdentifier bgTask = 0; bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ [app endBackgroundTask:bgTask]; }]; AudioSessionSetActive(false); 

并在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions使用此代码- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

 AudioSessionInitialize (NULL,NULL,NULL,NULL); UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback; AudioSessionSetProperty (kAudioSessionProperty_AudioCategory,sizeof (sessionCategory),&sessionCategory); AudioSessionSetActive(true); 

希望这可以帮助。

面对这个问题。 我建议你使用AVAudioSessionCategoryOptionMixWithOthers和-setCategory:withOptions:error:。 此外, 设置类别之后激活会话可能是有意义的,而不是之前。