目录
运行状态
应用的运行状态分为以下五种:
Not running
应用还没有启动,或者应用正在运行但是途中被系统停止。
Inactive
当前应用正在前台运行,但是并不接收事件(当前或许正在执行其它代码)。一般每当应用要从一个状态切换到另一个不同的状态时,中途过渡会短暂停留在此状态。唯一在此状态停留时间比较长的情况是:当用户锁屏时,或者系统提示用户去响应某些(诸如电话来电、有未读短信等)事件的时候。
Active
当前应用正在前台运行,并且接收事件。这是应用正在前台运行时所处的正常状态
Background
应用处在后台,并且还在执行代码。一般的应用,都只会在这个状态短暂停留(最多十分钟),然后就会被系统强制进入 Suspended 状态。而 iOS 为了在某些情况下提供更好的体验,提供了一些选项,只要满足这些选项的条件,就可以在后台运行很长的一段时间,下面我们将重点讨论可以使应用在后台长时间运行的方法
Suspended
应用处在后台,并且已停止执行代码。系统自动的将应用移入此状态,且在此举之前不会对应用做任何通知。当处在此状态时,应用依然驻留内存但不执行任何程序代码。当系统发生低内存告警时,系统将会将处于 Suspended 状态的应用清除出内存以为正在前台运行的应用提供足够的内存。
background modes
Capabilities 下添加 Background modes
如下图:info.plist文件中会自动生成Required Background Modes键,其值为App communicates using CoreBluetooth
Audio, AirPlay and Picture in Picture
这个选项中包含四种场景:音频的播放,录音,AirPlay及画中画的视频播放。
音频的播放:在播放音频时,即使应用退到后台,只要一直有音频在播放,那应用就可以一直在后台运行。
录音:应用可以请求使用麦克风,当开启了此后台选项,应用在使用麦克风时,即使退到后台,也可以一直后台运行,通过查看微信安装包中的 plist 文件,微信的语音聊天,就是通过这种方式实现的。而当该类应用退到后台后,iOS 系统的状态栏会变成红色,并在状态栏中显示正在使用麦克风的应用的名称,如下图所示。
AirPlay: AirPlay是指将iOS设备,或者Mac设备上的音视频,同步到另一个设备中播放。举两个例子,第一个是把 iPhone 上的音乐通过蓝牙的方式在汽车的蓝牙音响播放,第二个是把 iPhone 上的视频,同步到智能电视屏幕上播放。此功能一般用于多端及多屏的交互。
画中画的视频播放:画中画是 iPad 版本的 iOS 9 新增加的功能,可以在 iOS 的桌面,或者其他应用的界面的上面播放视频,从而该视频区域所属的应用就可以后台运行了。此功能现在只在 iPad 应用中提供。
Location updates
一般用于导航应用中,开启此选项后,应用退到后台,还可以得到系统的定位更新,从而使得应用可以根据定位的变化做出不同的反应。
Voice over IP
VOIP 类的应用允许用户使用网络而不是手机打电话,因此这一类的应用需要保持同它相关的服务的网络连接,用以收到来电事件和其他数据。iOS 不是通过一直让该应用处于激活状态来达到这个目的,而是同样也会将这类的应用挂起,但同时会在应用被挂起期间由系统接管它的 VOIP 的 Socket,当这个 Socket 有数据通信时,系统会再次唤醒处于挂起状态的应用,同时将 Socket 的控制权交还给该应用,以让其正常的处理来电事件和其他数据
External Accessory communication
此选项提供给一些MFi外设通过蓝牙,或者Lightning接头等方式与iOS设备连接,从而可在外设发送消息时,唤醒已经被挂起的应用。而一旦被唤醒,一般情况下,应用只有最多10秒钟的执行时间。 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 秒钟。
Remote Notifications
iOS7新增加的一个选项,是一种静默推送,它有别于一般的推送,应用收到此类推送后,不会有任何的界面提示,而当应用退到后台或者挂起时收到此类推送,iOS也会唤醒对应的应用。
Notice
提交审核时,App Store的审核人员会检查应用中是否有必要开启该后台运行模式选项,如果应用中不需要,而又开启了,可能会被拒。(亲测,会被拒,且是不定期)
总的来说,其实后台获取和静默推送在很多方面是很类似的,特别是实现和处理的方式,但是它们适用的情景是完全不同的。后台获取更多地使用在泛数据模式下,也即用户对特定数据并不是很关心,数据应该被更新的时间也不是很确定,典型的有社交类应用和天气类应用;而静默推送或者是推送唤醒更多地应该是用户感兴趣的内容发生更新时被使用,比如消息类应用和内容型服务等。
待验证:只有iOS10以上才支持app被唤醒后在后台/锁屏状态下播放音频。
行者常至,为者常成!