在默认环境下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!!播放歌曲后推出到后台,就可在底部菜单看到歌曲信息和控制音乐