iOS APP的运行状态
- Not runing:应用还没有启动,或者应用正在运行但是中途别系统停止。
- Inactive:当前应用正在前台运行,但是不接收事件(当前或许正在执行其他代码)。一般每当应用要从一个状态切换到另一个不同的状态时,中途过渡过短暂停留在此状态。唯一在此状态停留时间比较长的情况是:当用户锁屏时,或者系统提示用户去响应某些(诸如电话来电,有未读短信等)事件的时候。
- active:当前应用正在前台运行,并且接收事件。这是应用正在前台运行时所处的正常状态。
- Suspended:应用处在后台,并且已经停止执行代码。系统自动的将应用一如此状态,且在此举之前不会对应用做任何通知。当初在此状态时,应用依然驻留内存但不执行任何程序代码。当系统发生低内存警告时,系统会将处于Suspend状态的应用清除出内存以为正在前台运行的应用提供足够的内存。
- Background:应用处在后台,并且还在执行代码。一般的应用都会在这个状态短暂的停留(最多10分钟),然后就会被系统强制进入suspend状态。而iOS为了在某些情况下提供更好的体验,提供了一些选项,只要满足这些选项的条件,就可以在后台运行很长的一段时间。
后台模式 Background Modes
-
Audio, AirPlay and Picture in Picture
这个选项包含四种场景:音频的播放,录音,airPlay 以及画中画视频播放。 - 音频的播放:在播放音频时,即使应用退到后台,只要一直有音频在播放,那应用就可以一直在后台运行。
- 录音:应用可以请求使用麦克风,当开启了此后台选项,应用在使用麦克风时,即使退到后台,也可以一直后台运行,通过查看微信安装包中的plist文件,微信语音聊天,就是通过这种方式实现的。而当该类应用退到后台后,iOS系统的状态栏会变成红色,并在状态栏中显示正在使用麦克风的应用的名称。
- AirPlay:是指将iOS设备,或者Mac设备上的音视频,同步到另一个设备中播放。举两个例子,第一个是把iPhone上的音乐通过蓝牙的方式在汽车的蓝牙音箱播放,第二个是把iPhone上的视频,同步到智能电视屏幕上播放。此功能一般用于多端以及多屏的交互。
- 画中画的视频播放:画中画是ipad版本的iOS9新增的加的功能,可以在iOS的桌面,或者其他的应用的界面的上面提供播放视频,从而该视频区域所属的应用就可以后台运行了。此功能现在只在ipad应用中提供。
例如音频播放
-
事先在项目里导入一个MP3音频文件
- 导入AVFoundation框架,在APPdelegate中配置音频会话
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 后台播放音频设置
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setActive:YES error:nil];
[session setCategory:AVAudioSessionCategoryPlayback error:nil];
// 让APP支持接受远程控制事件
[[UIApplication sharedApplication]beginReceivingRemoteControlEvents];
_window = [[UIWindow alloc]initWithFrame:UIScreen.mainScreen.bounds];
_window.backgroundColor = UIColor.whiteColor;
_window.rootViewController = [[ViewController alloc]init];
[_window makeKeyAndVisible];
return YES;
}
//ViewController中播放音频
- (void)viewDidLoad {
[super viewDidLoad];
// 播放背景音乐
NSString *path = [[NSBundle mainBundle]pathForResource:@"01 丑八怪" ofType:@"mp3"];
NSURL *url = [[NSURL alloc]initFileURLWithPath:path];
// 创建播放器,_player一定要设置成全局变量,否则没有声音
_player = [[AVAudioPlayer alloc]initWithContentsOfURL:url error:nil];
[_player setVolume:1];
_player.numberOfLoops = -1;//-1为一直循环
_player.pan = 0.0;
_player.rate = 1.0;
[_player prepareToPlay];
[_player play];//播放
}
最后别忘了在Background modes 里面勾选第一条
打开info.plist 文件,可以看到配置已经写入
Location Updates
一般用于导航应用中,开启此选项后,因公退到后台,还可以得到系统的定位更新,从而使得应用可以根据定位的变化做出不同的反应Voice over IP
voip 类的应用允许用户使用网络而不是手机打电话,因此这一类的应用需要保持同它相关的服务的网络连接,用以收到来电事件和其他数据。iOS 不是通过一直让该应用处于激活状态来达到这个目的,而是同样也会将这类的应用挂起,但同时会在应用挂起期间由系统接管它的VoIP的socket,当这个socket有数据通信时,系统会再次唤醒处于挂起状态的应用,同时将socket的控制器交还给该应用,让其正常的处理来电事件和其他数据。Newsstand downloads
iOS开发中,有一类叫报刊杂志类的应用比较特别,iOS9之前的系统中,此类应用会统一收在系统内置的【报刊杂志】应用中,在iOS9中则去掉了内置的【报刊杂志】应用,此类应用得以以单独的图标入口出现在桌面中。此后台运行的选项就是提供给报刊杂志类应用可以哎后台下载及处理报刊杂志内容,而下载的过程需要使用NewsstandKit中的NKAssetDownload进行下载。需要注意的是,下载的过程中,应用可能还是会被挂起,设置应用被退出,而iOS会在WiFi环境下继续下载,知道下载完成。而一旦下载完成,如果应用只是被挂起,则iOS会唤醒对应的应用。回调对应的时间;如果应用已经退出,则会启动应用,在启动参数中带上对用的标识表示这次启动是因为下载报刊杂志内容完成。http://www.viggiosoft.com/blog/blog/2011/10/17/ios-newsstand-tutorial/External Accessory communication
此选项提供给一些MFI外设通过蓝牙,或者Lightning 接头等方式与ios设备连接,从而可在外设发送消息时,唤醒已被挂起的应用。而一旦被唤醒,一般情况下应用只有10s的执行时间。MFI外设:是指通过苹果MFI认证的设备,而MFI认证是对其授权配件厂商生产的外置配件的一种标识使用许可,是made for ios 的应为缩写。Uses Bluetooth LE accessories
此选项与External Accessory communication 类似,只是此选项不限制MFI外设,而需要的是Bluetooth LE 设备。Acts as a Bluetooth LE accessory
此选项是指iOS设备作为一个蓝牙外设连接时,
对应的应用可以后台运行,但是使用此模式需要用户进行授权认证。Background fetch
iOS7新增加的一个选项,用于即使在后台,也需要频繁的更新数据的应用。例如一个pm2.5的应用,需要几个小时更新一次数据,那么可以开启此选项,设置一个时间间隔,从而让iOS在间隔时间内在后台启动该应用,执行指定数据的获取工作,而此过程最多只能执行30秒,代码参考http://www.jianshu.com/p/82f639012f3eRemote notifications
iOS7新增的一个选项,推送唤醒,iOS7以前,当你收到推送消息时,你需要首先打开应用,等待应用从网络上获取推送的信息之后才能将信息呈现出来。而iOS7之后改变了这一过程。当系统收到推送消息时,不是首先提醒用户,而是唤醒对应的应用,让应用在后台获取对应的消息,当消息处理完成后再通知用户。而收到推送的回调方法最多只能执行30s(要包含"content-available":1字段,才能回调代理方法)。代码参考 http://www.jianshu.com/p/82f639012f3e基于 NSURLSession 的后台传输
此为iOS7新增加的特性,用于在后台下载或者上传大文件,步骤如下:创建后台传输用的NSURLsession对象,向这个对象中加入对用的传入的NSURLsessionTask,并开始传输;在实现Appdelegate里实现-application:handleEventsForBackgroundURLSession:completionHandler:方法,以刷新UI及通知系统传输结束。一旦后台传输的状态发生变化(包括正常结束和失败)的时候,应用将被唤醒并运行appdelegate的回调。但是也有一些限制,后台传输只会通过WiFi来进行。后台下载的时间与以前的关闭应用后x分钟的模式不一样,而是为了节省电力变为离散式的下载。代码实现可以参考:http://onevcat.com/2013/08/ios7-background-multitask/