IOS 后台运行 播放音乐

iOS 4开始引入的multitask,我们可以实现像ipod程序那样在后台播放音频了。如果音频操作是用苹果官方的AVFoundation.framework实现,像用AvAudioPlayer,AvPlayer播放的话,要实现完美的后台音频播放,依据app的功能需要,可能需要实现几个关键的功能。

首先,播放音频之前先要设置AVAudioSession模式,通常只用来播放的App可以设为AVAudioSessionCategoryPlayback即可。模式意义及其他模式请参考文档。

1 //后台播放音频设置
2 AVAudioSession *session = [AVAudioSession sharedInstance];
3 [session setActive:YES error:nil];
4 [session setCategory:AVAudioSessionCategoryPlayback error:nil];

1.通知IOS该app支持background audio。缺省情况下,当按下home键时,当前正在运行的程序被suspend,状态从active变成in-active,也就是说如果正在播放音频,按下HOME后就会停止。这里需要让app在按在HOME后,转到后台运行而非被suspend,解决办法是在程序的-info.plist中增加required background modes这个key项,并选择App plays audio or streams audio/video using AirPlay这个value项(如果用过Xcode5.0,在TARGETS-Capabilities-Background
Modes设置为ON,勾选Audio and AirPlay选项)。

2.如果你在后台播放使用的时加载网络音频,恰巧网速很慢,音频被停止下来这时候程序也随之suspend,曾经有山寨的解决办法是专门起一个player的实例连续不停的放同一无声音片断,阻止程序被suspend。这里提供的方法是通过申请后台taskID达到后台切换播放文件的功能。

即使声明taskID也最多只能在后台运行600秒钟。(在ios7sdk中可以使用NSURLSession来实现后台缓冲)

(一般情况下,按HOME将程序送到后台,可以有5或10秒时间可以进行一些收尾工作,具体时间[[UIApplication sharedApplication] backgroundTimeRemaining]返回值,超时后app会被suspend。)

3.ipod播放程序在后台时,双击HOME键,会有个控制界面,可以对它进行播放控制(暂停开始、上一曲、下一曲)。如果您想让您的app可以像ipod一样在后台也可以方便的通过双击HOME键来控制(在ios7中是使用上拉菜单控制),就要用到远程控制事件了。

首先在viewdidload等初始化的地方声明App接收远程控制事件,并在相应地方结束声明

- (void) viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
[self becomeFirstResponder];
}

- (void) viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[UIApplication sharedApplication] endReceivingRemoteControlEvents];
[self resignFirstResponder];
}

- (BOOL)canBecomeFirstResponder
{
       return YES;
}

当然也不一定是在viewcontroller中,也可以是在applicationDidEnterBackground:方法中开始接受远程控制,applicationDidBecomeActive:中结束接受远程控制,但是当前的appdelegate中要继承与UIResponder,因为在激活远程控制以后要把当前类变成第一响应,重写canBecomeFirstResponder方法。

最后定义 remoteControlReceivedWithEvent,处理具体的播放、暂停、前进、后退等具体事件

//重写父类方法,接受外部事件的处理
- (void) remoteControlReceivedWithEvent: (UIEvent *) receivedEvent {
    if (receivedEvent.type == UIEventTypeRemoteControl) {

        switch (receivedEvent.subtype) {

            case UIEventSubtypeRemoteControlTogglePlayPause:
                [self playAndStopSong:self.playButton];
                break;

            case UIEventSubtypeRemoteControlPreviousTrack:
                [self playLastButton:self.lastButton];
                break;

            case UIEventSubtypeRemoteControlNextTrack:
                [self playNextSong:self.nextButton];
                break;

            case UIEventSubtypeRemoteControlPlay:
                [self playAndStopSong:self.playButton];
                break;

            case UIEventSubtypeRemoteControlPause:
                [self playAndStopSong:self.playButton];
                break;

            default:
                break;
        }
    }
}

其它外部事件也可通过这种方式实现,如“摇一摇”响应等。

4. 至此,您有播放App已经基本完成了,其次插拔耳机是否响应停止播放时间需要进一步研究耳机检测和声音路由切换的问题,再次不详细讲述。

5. 还有一些开发者可能会发现,有一些音视频app在定义的时候自定一些控件可以调节系统的音量大小,不需要用户调整音量按钮。经查看相关的资料总结出有两种方法:

一种是调用控件MPVolumeView在屏幕中创建一个音量条,拖动可以改变系统的音量大小。

另一种是使用MPMusicPlayerController类,可以自定义控件调整系统音量的大小(但是在ios7sdk中已经被弃用,估计以后几个版本中可能找不到这个方法了)。

MPMusicPlayerController *mpc = [MPMusicPlayerController applicationMusicPlayer];
mpc.volume = 0;  //0.0~1.0

6. 在一些其他的音乐播放软件中如:酷我、qq音乐等,你会发在播放的时候,当设备锁屏以后依然可以看到用户播放的音乐名称、演唱者、专辑名称、音乐时长、专辑图片等信息。这些就需要在用户切换完歌去的时候,在程序中设置信息了。

//设置锁屏状态,显示的歌曲信息
-(void)configNowPlayingInfoCenter{
    if (NSClassFromString(@"MPNowPlayingInfoCenter")) {
        NSDictionary *info = [self.musicList objectAtIndex:_playIndex];
        NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];

        //歌曲名称
        [dict setObject:[info objectForKey:@"name"] forKey:MPMediaItemPropertyTitle];

        //演唱者
        [dict setObject:[info objectForKey:@"singer"] forKey:MPMediaItemPropertyArtist];

        //专辑名
        [dict setObject:[info objectForKey:@"album"] forKey:MPMediaItemPropertyAlbumTitle];

        //专辑缩略图
        UIImage *image = [UIImage imageNamed:[info objectForKey:@"image"]];
        MPMediaItemArtwork *artwork = [[MPMediaItemArtwork alloc] initWithImage:image];
        [dict setObject:artwork forKey:MPMediaItemPropertyArtwork];

        //音乐剩余时长
        [dict setObject:[NSNumber numberWithDouble:self.player.duration] forKey:MPMediaItemPropertyPlaybackDuration];

        //音乐当前播放时间 在计时器中修改
        //[dict setObject:[NSNumber numberWithDouble:0.0] forKey:MPNowPlayingInfoPropertyElapsedPlaybackTime];

        //设置锁屏状态下屏幕显示播放音乐信息
        [[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:dict];
    }
}

上面的if (NSClassFromString(@”MPNowPlayingInfoCenter”))语句,说是为了避免了版本兼容问题,这个API貌似只出现在5里面。

7. 下面就在计时器中不断刷新锁屏状态下的播放进度条了。

//计时器修改进度
- (void)changeProgress:(NSTimer *)sender{
    if(self.player){
        //当前播放时间
        NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithDictionary:[[MPNowPlayingInfoCenter defaultCenter] nowPlayingInfo]];
        [dict setObject:[NSNumber numberWithDouble:self.player.currentTime] forKey:MPNowPlayingInfoPropertyElapsedPlaybackTime]; //音乐当前已经过时间
        [[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:dict];

    }
}

8. 当前的很多常见的播放器都可以在锁屏状态下显示显示歌词,经过一番查找后,终于找到方法(详情:点击查看),大致就是根据播放的时间和歌词显示时间,利用计时器不断的用歌词和专辑封面合成图片,达到显示歌词的效果。还有就是在屏幕变暗停止这一操作、屏幕点亮的时候开始计时器,以节省电量和cpu,有两种方法可以监听上述现象:

一种是监听内核层DarwinNotification,在Darwin中,有很多的系统事件,但apple的api文档描述这些api使用有限制,也就是灰色地带的api,所以能不用则不用;

另一种方法可以通过notify_get_state来获取com.apple.springboard.hasBlankedScreen 的状态值,通过状态值我们可以判断屏幕状态,屏幕亮或者暗系统会给出不同状态值,然后根据状态值,通过NotificationCenter发送消息通知给相应的函数处理。

from:http://www.cnblogs.com/easy-coding/p/3569227.html

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-26 18:37:23

IOS 后台运行 播放音乐的相关文章

iOS 后台运行实现

iOS 后台运行的规则 应用的运行状态分为以下五种:Not running:应用还没有启动,或者应用正在运行但是途中被系统停止.Inactive:当前应用正在前台运行,但是并不接收事件(当前或许正在执行其它代码).一般每当应用要从一个状态切换到另一个不同的状态时,中途过渡会短暂停留在此状态.唯一在此状态停留时间比较长的情况是:当用户锁屏时,或者系统提示用户去响应某些(诸如电话来电.有未读短信等)事件的时候.Active:当前应用正在前台运行,并且接收事件.这是应用正在前台运行时所处的正常状态Su

IOS后台运行机制 与 动作

当用户按下"Home"键或者系统启动另外一个应用时,前台foreground应用首先切换到Inactive状态,然后切换到Background状态.此转换将会导致先后调用应用代理的applicationWillResignActive:和applicationDidEnterBackground:方法. 在applicationDidEnterBackground:方法返回后,大部分应用在之后不久转入suspended状态.对于请求特定后台background任务的应用,比如播放音乐应

iOS 后台运行 类型

iOS后台运行,需要有特定的类型才可以进行.这些内容并不是一直不变的,苹果也在逐步的更新这些内容. 本文内容是2015年11月03日时苹果支持的后台运行类型. 这是官方连接地址 其中较为重要的是下面这张表,我已截图出来. 解释一下: 1. 音频播放和录制: 2. 位置更新: 3. VOIP: *4. 后台下载(此处指预更新): 5. 使用External Accessory framework库(通常是通过MFI认证的蓝牙应用): 6. 蓝牙应用(使用Core Bluetooth framewo

IOS后台运行 之 后台播放音乐

iOS 4开始引入的multitask,我们可以实现像ipod程序那样在后台播放音频了.如果音频操作是用苹果官方的AVFoundation.framework实现,像用AvAudioPlayer,AvPlayer播放的话,要实现完美的后台音频播放,依据app的功能需要,可能需要实现几个关键的功能. 首先,播放音频之前先要设置AVAudioSession模式,通常只用来播放的App可以设为AVAudioSessionCategoryPlayback即可.模式意义及其他模式请参考文档. //后台播放

iOS 后台运行实现 --备用

文一 我从苹果文档中得知,一般的应用在进入后台的时候可以获取一定时间来运行相关任务,也就是说可以在后台运行一小段时间. 还有三种类型的可以运行在后以,1.音乐2.location 3.voip 文二 在IOS后台执行是本文要介绍的内容,大多数应用程序进入后台状态不久后转入暂停状态.在这种状态下,应用程序不执行任何代码,并有可能在任意时候从内存中删除.应用程序提供特定的服务,用户可以请求后台执行时间,以提供这些服务. 判断是否支持多线程 UIDevice* device = [UIDevice c

iOS后台运行

我从苹果文档中得知,一般的应用在进入后台的时候可以获取一定时间来运行相关任务,也就是说可以在后台运行一小段时间.还有三种类型的可以运行在后以,1.音乐2.location3.voip 文二 在IOS后台执行是本文要介绍的内容,大多数应用程序进入后台状态不久后转入暂停状态.在这种状态下,应用程序不执行任何代码,并有可能在任意时候从内存中删除.应用程序提供特定的服务,用户可以请求后台执行时间,以提供这些服务. 判断是否支持多线程 UIDevice* device = [UIDevice curren

iOS后台运行机制简解

1.iOS其实是伪后台 为什么说iOS是伪后台?首先需要了解一下iOS中的后台进程到底是怎么回事.iOS中所谓的“后台驻留”并不是指执行中的程序,而是指最近使用过的程序.当我们是一个进程进入到后台的时候,可以想象成是Command+Tab键盘. 一般来说,当把一个app退到后台的时候都会有5s的时间执行缓冲,有些程序可以要求达到10分钟(这个是需要开发人员来决定的),因此在按下Home键之后,本来的程序就会退到后台中去,最多10分钟之后还是会被终止的,这当然和苹果的后台管理机制有关.   2.i

ios后台运行机制

IOS长时间后台运行的实现代码 1.检查设备是否支持多任务 Apple出于性能的考虑,并不是所有的iOS设备升级到iOS4以后都支持多任务,比如iPhone 3G.如果你的应用在没有多任务特性时会出问题,为了保持应用的健壮性,你应该对此进行判断并处理.你可以通过调用UIDevice对象的multitaskingSupported属性来获取当前设备是否支持多任务. [cpp] view plaincopy if(![UIDevicecurrentDevice].multitaskingSuppor

iOS后台运行的设置方法

关于让程序保持后台运行有两种方方法: 1.直接上图:(当后台的内存实在是没有的时候,系统就会终止后台运行,也就是说这个的时间不确定的,这种方式是可怜的像后台申请后台运行的要求,是很可怜的的一种方法!!) 2.配置plist文件:在Info.plist中声明自己的应用类型为audio.在后台播放mp3(共有五种方法,这里不一一赘述,仅以audio为例,其余基本相似) 2.1>>>> 添加UIBackgroundModes中audio值,注册后台音频应用.这个值使得应用程序可以在后台使