在默认环境下App被切换到后台时,音乐的就停止播放了,但音乐类App的一般都会需要在后台继续播放,这样用户就可以一边听音乐,一边操作其他的App。对于这种情况我们可以对App做一些简单的配置,实现后台播放功能。当app切换到后台,用户就无法控制和查看app当前播放歌曲了。这个对于用户来说并不是很友好。既然是后台播放,那么就应该提供便捷的播放控制方式。iOS系统已经预留了接口,允许开发者在锁屏界面显示播放歌曲信息(以下称为锁屏封面),以及在底部菜单栏提供播放控制器。下面我们就来给App添加这些功能吧!(摘录:http://itony.me/305.html)

PS:环境 Xcode5

1、后台播放

设置App的plist,使app可以在后台播放音乐。
myApp-Info.plist中添加Requiredbackground modes键值,添加子键值为App plays audio or streams audio/video using AirPlay。
 
然后再程序中添加入下代码
AVAudioSession   sharedInstance] setCategory:  AVAudioSessionCategoryPlayback  error:  nil];
    
// Activates the audio session.
    
NSError *activationError = nil;
    
AVAudioSession   sharedInstance] setActive:  YES   error: &activationError];
 
if (activationError)  NSLog(@"activ error");


再程序委托中添加如下代码:

- (void)applicationWillResignActive:(UIApplication
{ /*当应用程序发送即将从活跃不活跃的状态。这可能发生某些类型的暂时中断(如传入的电话或短信)或当用户退出应用程序,它开始过渡到后台状态。
       使用这种方法暂停正在进行的任务,禁用计时器,和节流OpenGL ES帧率。游戏应该使用这种方法暂停游戏。*/
beginBackgroundTaskWithExpirationHandler:NULL];
}

- (void)applicationDidBecomeActive:(UIApplication{
/*重启任何任务暂停(或没有开始),而应用程序是不活跃的。如果应用程序在后台以前,可选更新用户界面。*/
endBackgroundTask:UIBackgroundTaskInvalid];
}
 
 
这样程序就能支持播放后台音乐,下面加入播放音乐的代码,测试一下:
//用下列代码播放音乐,测试后台播放
// 创建播放器
NSString *soundFilePath = [[NSBundle mainBundle]    pathForResource:@"4482344"   ofType:@"mp3"];
    
NSURL *url = [NSURL fileURLWithPath:soundFilePath]; 
 
//initialize our audio player
audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
    
if (!audioPlayer) NSLog(@"error");
audioPlayer.numberOfLoops = -1; //设置音乐播放次数  -1为一直循环
//prepare and set delegate
audioPlayer   prepareToPlay]; 
audioPlayer    setDelegate:self];
//play audio
[audioPlayer    play];

 

 

2、在后台播放中,使用远程控制(底部菜单栏和锁屏封面)

想要接收播放控制消息,我们必须要做三件事:

  • 成为Frist Responder
  • 请求系统,要求开始监听播放控制消息(Remote Control Events)
  • 开始播放音频。

请注意第三点,我们的App必须在开始播放音频后,才能收到控制消息。否则,即使你满足了前两点,也无法接收到控制消息。

在你需要被远程控制的控制中添加如下代码,注意要让控制器接受远程控制必须成为Frist Responder :
- (void)viewWillAppear:(BOOL)animated{
//以及设置app支持接受远程控制事件代码。设置app支持接受远程控制事件,
//其实就是在dock中可以显示应用程序图标,同时点击该图片时,打开app。
//或者锁屏时,双击home键,屏幕上方出现应用程序播放控制按钮。
UIApplication  sharedApplication] beginReceivingRemoteControlEvents];
self  becomeFirstResponder]; //成为FristResponder}
 
- (void)viewWillDisappear:(BOOL)animated{
showTimer  invalidate];
UIApplication  sharedApplication] endReceivingRemoteControlEvents];
self  resignFirstResponder];
}

在控制器中,实现remoteControlReceivedWithEvent:委托接受来自远程控制

- (void)remoteControlReceivedWithEvent:(UIEvent
{
if (event.type == UIEventTypeRemoteControl) {
switch (event.subtype) {
case   UIEventSubtypeRemoteControlPause:
// 切换播放、暂停按钮
NSLog(@"切换暂停按钮");
audioPlayer  pause];
                
break;
case  UIEventSubtypeRemoteControlPlay:
// 切换播放、暂停按钮
NSLog(@"切换播放按钮");
audioPlayer  play];
           
break;
                
case  UIEventSubtypeRemoteControlPreviousTrack:
// 播放上一曲按钮
NSLog(@"播放上一曲按钮");
audioPlayer  play];
break;
                
case  UIEventSubtypeRemoteControlNextTrack:
// 播放下一曲按钮
NSLog(@"播放下一曲按钮");
break;
                
default:
break;
       }
    }
     [selfsetLockScreenNowPlayingInfo];
}
 
除了要接受底部菜单播放器和锁屏播放器的控制外,一般我们还得在上面显示歌曲的歌名信息等。通过以下代码可实现:
- (void)setLockScreenNowPlayingInfo
{
//更新锁屏时的歌曲信息
if (NSClassFromString(@"MPNowPlayingInfoCenter")) {
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
       
       
setObject:@"小路恢弘的歌曲名" forKey:MPMediaItemPropertyTitle];
setObject:@"小路恢弘" forKey:MPMediaItemPropertyArtist];
setObject:@"小路恢弘专辑名" forKey:MPMediaItemPropertyAlbumTitle];
setObject:@"323" forKey:MPMediaItemPropertyPlaybackDuration];
       
setObject:@"64" forKey:MPNowPlayingInfoPropertyElapsedPlaybackTime];
       
  if(audioPlayer.playing) {
           [dict setObject:[NSNumber numberWithFloat:1.0] forKey:MPNowPlayingInfoPropertyPlaybackRate];
       }else{
           [dict setObject:[NSNumber numberWithFloat:0.0] forKey:MPNowPlayingInfoPropertyPlaybackRate];
       }
 
UIImage *newImage = [UIImage imageNamed:@"6190250_Small.jpg"];//锁屏封面
setObject:[[[MPMediaItemArtwork alloc] initWithImage:newImage] autorelease]
forKey:MPMediaItemPropertyArtwork];
       
       
       
MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:dict];
    }
}

OK!!播放歌曲后推出到后台,就可在底部菜单看到歌曲信息和控制音乐