使用AVAudioplayer在后台播放音乐

即使应用程序在后台运行,我也想播放音乐。 我检查了所有的stackoverflow链接,但没有一个工作。 请帮助需要今天做。

我曾经使用下面的代码:

NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"Day At The Beach" ofType: @"mp3"]; NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: soundFilePath]; NSError *error; playerTemp = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:&error]; playerTemp.numberOfLoops = 0; AudioSessionSetActive(true); [playerTemp play]; 

我通过引用iOS应用程序后台任务解决了这个问题

并在我们的应用程序的.plist文件中进行一些更改..

更新

把这个代码写在你的控制器的视图中,像这样做加载方法

 - (void)viewDidLoad { NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"in-the-storm" ofType:@"mp3"]]; AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; [[AVAudioSession sharedInstance] setActive: YES error: nil]; [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; [audioPlayer play]; [super viewDidLoad]; } 

我只是想给Mehul的回答添加一个注释。 这一行:

 [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 

其实很重要。 我使用其他教程来启动并运行AVAudioPlayer。 一切正常,除了我的audio不会开始,如果应用程序在后台。 为了澄清,我的audio是好的,如果它已经在播放时,应用程序进入背景…但它不会开始,如果应用程序已经在后台。

添加上面的代码行使它即使应用程序在后台我的audio将开始。

你需要在Info.plist中将'audio'设置为你的一个UIBackgroundMode。 苹果有关于这个问题的文档 。

甚至可以使用MPMoviePlayerController播放独奏audio电影。 如果您喜欢,请阅读详细的Apple Library技术问答:

iOS开发人员库技术问答QA1668

步骤1

在info.plist中进行以下更改

  1. 应用程序不会在后台运行:NO

  2. 所需的背景模式

    item0 :App plays audio or streams audio/video using AirPlay

第2步不要忘记在MainViewController.h文件中添加以下内容

  1. #import <'AVFoundation/AVAudioPlayer.h>
  2. @interface MainViewController:<'AVAudioPlayerDelegate>

  3. AVAudioPlayer *H_audio_player;

步骤3MainViewController类的播放操作中添加以下代码。

 NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%d-%d",C_CID, C_SID] ofType:@"mp3"]; NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath]; H_audio_player = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:nil]; H_audio_player.delegate = self; H_audio_player.numberOfLoops = -1; 

写这行以plist为背景运行…

 <key>UIBackgroundModes</key> <array> <string>audio</string> </array> 

写这个代码你想使用的地方

 AVAudioPlayer* audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:self.urlForConevW error:&error]; audioPlayer.delegate = self; [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; [[AVAudioSession sharedInstance] setActive: YES error: nil]; [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; audioPlayer.numberOfLoops = 1; [audioPlayer play]; 

在这里也很重要,如果你使用MPMusicPlayerController :你必须使用:

 [MPMusicPlayerController iPodMusicPlayer] 

并不是

 [MPMusicPlayerController applicationMusicPlayer] 

另外,如果您不希望自己的应用stop music应用启动时播放的stop music ,请看这里: AVAudioPlayerclosuresiPod – 如何解决?

我使用下面的代码。 它为我工作,并调用button点击audio播放器实例方法。

 NSError *error; NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"music" ofType:@"mp3"]]; self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&error]; [[AVAudioSession sharedInstance] setActive:YES error: &error]; [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; [self.player prepareToPlay]; 

从所有的答案是缺less这个代码来控制玩家当用户醒来的设备:

 - (BOOL)canBecomeFirstResponder { return YES; } - (void)remoteControlReceivedWithEvent:(UIEvent *)event { switch (event.subtype) { case UIEventSubtypeRemoteControlPlay: [_audioPlayer play]; break; case UIEventSubtypeRemoteControlPause: [_audioPlayer pause]; break; default: break; } } 

你有所有这些选项:

 UIEventSubtypeRemoteControlPlay = 100, UIEventSubtypeRemoteControlPause = 101, UIEventSubtypeRemoteControlStop = 102, UIEventSubtypeRemoteControlTogglePlayPause = 103, UIEventSubtypeRemoteControlNextTrack = 104, UIEventSubtypeRemoteControlPreviousTrack = 105, UIEventSubtypeRemoteControlBeginSeekingBackward = 106, UIEventSubtypeRemoteControlEndSeekingBackward = 107, UIEventSubtypeRemoteControlBeginSeekingForward = 108, UIEventSubtypeRemoteControlEndSeekingForward = 109, 

如果即使将audio设置为plist中的一个UIBackgroundModes ,audio在进入后台时UIBackgroundModes停止,请尝试setting application's audio sessionmedia playback

以下是相关的参考资料: https : //developer.apple.com/library/ios/documentation/Audio/Conceptual/AudioSessionProgrammingGuide/Introduction/Introduction.html

这是关于代码的样子:

 NSError *activationError = nil; [[AVAudioSession sharedInstance] setActive: YES error: &activationError]; NSError*setCategoryError = nil; [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: &setCategoryError]; 

在后台播放audio

第1步:只需在你的info.plist中添加一个数组 在这里输入图像描述

第2步 :

 - (void)applicationDidEnterBackground:(UIApplication *)application { __block UIBackgroundTaskIdentifier task = 0; task=[application beginBackgroundTaskWithExpirationHandler:^{ NSLog(@"Expiration handler called %f",[application backgroundTimeRemaining]); [application endBackgroundTask:task]; task=UIBackgroundTaskInvalid; }]; } 

第三步:

 NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"iNamokar" ofType:@"mp3"]; NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:soundFilePath]; AVAudioPlayer *newPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil]; [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; [[AVAudioSession sharedInstance] setActive: YES error: nil]; [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; [player prepareToPlay]; [self.player play]; 

从Apple的示例代码:混音器(MixerHost)

 // If using a nonmixable audio session category, as this app does, you must activate reception of // remote-control events to allow reactivation of the audio session when running in the background. // Also, to receive remote-control events, the app must be eligible to become the first responder. - (void) viewDidAppear: (BOOL) animated { [super viewDidAppear: animated]; [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; [self becomeFirstResponder]; } 

我认为以下情况不需要遥控事件:

 AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(value), &value);