iOS 4開始引入的multitask。我们能够实现像ipod程序那样在后台播放音频了。

假设音频操作是用苹果官方的AVFoundation.framework实现。像用AvAudioPlayer。AvPlayer播放的话。要实现完美的后台音频播放,根据app的功能须要。可能须要实现几个关键的功能。

首先,播放音频之前先要设置AVAudioSession模式。通常仅仅用来播放的App能够设为AVAudioSessionCategoryPlayback就可以。模式意义及其它模式请參考文档。

1
2
3
4
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接收远程控制事件。并在对应地方结束声明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- (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,处理详细的播放、暂停、前进、后退等详细事件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//重写父类方法。接受外部事件的处理
- (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在定义的时候自定一些控件能够调节系统的音量大小,不须要用户调整音量button。经查看相关的资料总结出有两种方法:
一种是调用控件MPVolumeView在屏幕中创建一个音量条。拖动能够改变系统的音量大小。
还有一种是使用MPMusicPlayerController类,能够自己定义控件调整系统音量的大小(可是在ios7sdk中已经被弃用。预计以后几个版本号中可能找不到这种方法了)。

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

6. 在一些其它的音乐播放软件中如:酷我、qq音乐等,你会发在播放的时候。当设备锁屏以后依旧能够看到用户播放的音乐名称、演唱者、专辑名称、音乐时长、专辑图片等信息。

这些就须要在用户切换完歌去的时候,在程序中设置信息了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//设置锁屏状态,显示的歌曲信息
-(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. 以下就在计时器中不断刷新锁屏状态下的播放进度条了。

1
2
3
4
5
6
7
8
9
10
//计时器改动进度
- (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

本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5133041.html,如需转载请自行联系原作者

IOS 后台执行 播放音乐相关推荐

  1. IOS 后台运行 播放音乐

    iOS 4开始引入的multitask,我们可以实现像ipod程序那样在后台播放音频了.如果音频操作是用苹果官方的AVFoundation.framework实现,像用AvAudioPlayer,Av ...

  2. ios 后台唤醒应用_IOS开发之----详解在IOS后台执行

    文一 我从苹果文档中得知,一般的应用在进入后台的时候可以获取一定时间来运行相关任务,也就是说可以在后台运行一小段时间. 还有三种类型的可以运行在后以, 1.音乐 2.location 3.voip 文 ...

  3. android后台自播放音乐,Android实现后台播放音乐(Service方式)

    Android实现后台播放音乐(Service方式) 实现: 在res文件夹下添加raw文件夹,添加mp3/4格式的音乐文件 注意命名规则只能是a-z,0-9,和下划线_ 不能大写字母和- Andro ...

  4. ios html5 audio mp3,H5 audio 微信端 在IOS上不能播放音乐

    前言 在做各种HTML5场景页面的时候,插入背景音乐是一个很普遍的需求.我们都知道,iOS下的safari是无法自动播放音乐的,以至一直以来形成了一种认知,iOS是无法自动播放媒体资源的.直到微信火爆 ...

  5. H5微信端在IOS上不能播放音乐解决方案

    前言 在做各种HTML5场景页面的时候,插入背景音乐是一个很普遍的需求.我们都知道,iOS下的safari是无法自动播放音乐的,以至一直以来形成了一种认知,iOS是无法自动播放媒体资源的.直到微信火爆 ...

  6. iOS后台音频播放及锁屏界面显示音频信息

    iOS后台播放音乐及用户交互处理 后台播放是任何一个音频软件都支持的功能,在上一篇博客中,详细介绍了使用AVAudioPlayer播放音频的方法,这篇博客将对后台的处理做介绍,关于播放与设置音频的博客 ...

  7. iphone 后台循环播放音乐

    http://www.devdiv.com/forum.php?mod=viewthread&tid=131889&highlight= http://www.diwublog.com ...

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

    IOS后台运行 之 后台播放音乐 iOS 4开始引入的multitask,我们可以实现像ipod程序那样在后台播放音频了.如果音频操作是用苹果官方的AVFoundation.framework实现,像 ...

  9. bugku 管理员系统 后台代码_不会吧,这也行?iOS后台锁屏监听摇一摇

    [toc] 背景介绍 一般情况下,出于省电.权限.合理性等因素考虑,给人的感觉是很多奇怪的需求安卓可以实现,但是iOS就无法实现!今天要介绍的需求也有这种感觉,就是"当 APP 处于后台或锁 ...

最新文章

  1. 哪个版本python适用于windows-何种版本的Python适合您
  2. Dart中的catchError捕获顺序
  3. dokuwiki 的管理和使用(补充)
  4. Spark _25 _读取Hive中的数据加载成DataFrame/DataSet(四)
  5. hp代码改成linux代码,HP Database Archiving Software远程任意代码执行漏洞
  6. 无法删除计算机文件是什么意思,该计算机是Windows10系统,我不知道为什么最近无法删除某些文件...
  7. lru算法c语言实现单链表,基于单链表实现LRU算法
  8. 将mysql表数据拼接成oracle的insert语句
  9. mysql建表测试_总结MySQL建表、查询优化实用小技巧
  10. 虚拟服务器添加打印机,在VMware Workstation 7虚拟机中应用主机打印机
  11. 冯仑《企业领导最容易犯的十大错误》
  12. 【Pyecharts50例】GEO使用外国地图/使用美国地图
  13. 南京信息工程大学python期末考试_南京信息工程大学的雷丁学院怎么样?
  14. MATLAB强化学习入门——四、用DQN实现网格迷宫算例
  15. 2020版影视制作学习路线图(含大纲+视频+工具+书籍+面试)
  16. 好数推荐 数据堂平均音色语音库
  17. 女友闹别扭不用担心,python做个软件轻松哄好
  18. HTML5在手机端如何全屏展示
  19. HttpStatus状态详解
  20. 微型计算机三部分基本组成,微型计算机的基本组成

热门文章

  1. 【解题】核电站问题(SGOI)
  2. bzoj1905: Soldier 士兵控制的棋盘
  3. 初入测试如何编写测试用例?从3个方面带你写一个合格的测试用例
  4. 串口屏之------Usart GPU 使用手册
  5. 【TypeScript】JSX 元素隐式具有类型 “any“,因为不存在接口 “JSX.IntrinsicElements“。ts(7026)
  6. origin里绘制横纵坐标都不一致的两条曲线
  7. “No input file specified “问题的处理
  8. 信息系统项目管理师----成本类计算
  9. cs与msf的联合使用
  10. 【嵌入式】MSP430系统实时时钟RTC学习日志(完善中)