ios 音乐后台播放 远程控制

在默认环境下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 *)application

{ /*当应用程序发送即将从活跃不活跃的状态。这可能发生某些类型的暂时中断(如传入的电话或短信)或当用户退出应用程序,它开始过渡到后台状态。

       使用这种方法暂停正在进行的任务,禁用计时器,和节流OpenGL ES帧率。游戏应该使用这种方法暂停游戏。*/

   [application beginBackgroundTaskWithExpirationHandler:NULL];

}

 

- (void)applicationDidBecomeActive:(UIApplication *)application

{

    /*重启任何任务暂停(或没有开始),而应用程序是不活跃的。如果应用程序在后台以前,可选更新用户界面。*/

    [application 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 *)event

{

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

       

       

       [dict setObject:@"小路恢弘的歌曲名" forKey:MPMediaItemPropertyTitle];

       [dict setObject:@"小路恢弘" forKey:MPMediaItemPropertyArtist];

       [dict setObject:@"小路恢弘专辑名" forKey:MPMediaItemPropertyAlbumTitle];

       [dict setObject:@"323" forKey:MPMediaItemPropertyPlaybackDuration];

       

       [dict 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"];//锁屏封面

       [dict setObject:[[[MPMediaItemArtwork alloc] initWithImage:newImage] autorelease]

                 forKey:MPMediaItemPropertyArtwork];

       

       

       

       [[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:dict];

    }

}

 

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

你可能感兴趣的:(ios 音乐后台播放 远程控制)