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

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

  1. IOS 后台执行 播放音乐

    iOS 4開始引入的multitask.我们能够实现像ipod程序那样在后台播放音频了. 假设音频操作是用苹果官方的AVFoundation.framework实现.像用AvAudioPlayer.A ...

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

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

  3. iOS 后台运行实现总结

    原文:http://www.jianshu.com/p/d3e279de2e32 iOS 后台运行的规则 应用的运行状态分为以下五种: Not running:应用还没有启动,或者应用正在运行但是途中 ...

  4. iOS 后台运行一段时间(不是地图,音乐类型APP)

    iOS 通常是不能在后台运行的,尤其是用户点击锁屏键,APP进入后台,网络立马断开等.如何解决这个问题呢?在APP进入后台,APP怎么争取一些时间来"善后".代码如下:注:需要定义 ...

  5. IOS后台运行机制详解(二)

    (温馨提示:亲,请先看上篇,此文乃下篇) 三.iOS长时间后台运行的实现代码 1.检查设备是否支持多任务 Apple出于性能的考虑,并不是所有的iOS设备升级到iOS4以后都支持多任务,比如iPhon ...

  6. IOS后台运行机制详解(一)

    一.iOS的"伪后台"程序 首先,先了解一下iOS 中所谓的「后台进程」到底是怎么回事吧? Let me be as clear as I can be: the iOS mult ...

  7. iOS后台运行机制1

    iOS支持三种后台运行方式: audio:在后台提供声音播放功能,包括音频流和播放视频时的声音 location:在后台可以保持用户的位置信息 voip:在后台使用VOIP功能 一.iOS的" ...

  8. iOS 后台运行保活

    前言 iOS有两种后台运行保活方式,第一种叫无声音乐保活(即在后台开启音频播放,只不过不需要播放出音量且不能影响其他音乐播发软件),第二种叫Background Task,但是这种方法在iOS 13以 ...

  9. iOS后台运行NSTimer

    iOS 允许的几种后台 几种后台存活的模式 ios7之后(一个app可以混合调用多种模式):Background Audio.VoIP.Location Services.Newsstand.Back ...

最新文章

  1. MFC 对话框小总结
  2. 计划策略-20-订货型生产
  3. nginx php mysql 部署_Linux+Nginx+Mysql+Php运维部署
  4. 浏览器导入和导出cookie
  5. js动态加载css文件和js文件的方法
  6. linux shell常用函数,ps
  7. 安卓原生系统_你没有用过的安卓系统:原生安卓桌面体验
  8. CSDN - markdown 编辑器模板
  9. 几张趣图助你理解HTTP状态码
  10. 微信接口开发,config提示OK,但分享不成功
  11. 大数据开发岗面试30天冲刺 - 日积月累,每日五题【Day01】——Hive1
  12. 2020.2.19作业单
  13. 常用的邮箱有哪些?公司邮箱如何申请?
  14. microsoft 365 E5申请过程收不到验证码的解决方案
  15. 华为eNSP模拟器操作技巧之关闭信息提示
  16. 密歇根安娜堡大学的计算机科学教授,曾亮(美国国家工程院院士、密歇根大学遥感学教授)_百度百科...
  17. Linux终端编程--termios
  18. 联网下载jar包导入本地Maven库
  19. RN 原生模块及组件入门
  20. Centos7 安装ifconfig命令

热门文章

  1. 西宁-青海--茶卡盐湖-敦煌自由行攻略
  2. emui11是鸿蒙系统吗,搭载鸿蒙内核的EMUI11.1机型曝光了,快看有你用的吗
  3. ubuntu18.04桌面卡住鼠标可以动 键盘失效
  4. 《信息物理融合系统(CPS)设计、建模与仿真——基于 Ptolemy II 平台》——1.3 模型在设计中的作用...
  5. 更专业的过等保服务,华为云等保合规解决方案值得选择!
  6. 前端学习之路坑一:json对象和JS对象
  7. Cluster analysis :Basic Concepts and Algorithms -- Part 1 Overview
  8. java调用百度AI实现图文识别功能
  9. UiAutomator Android 的自动测试框架(基础)
  10. 《关于我重装系统后修复VSCode这档事》C++环境配置