Reference:
app的生命周期
ios background modes
在知道APP是如何在内存中保持一直运行后之后,接下来需要知道的是APP运行时有哪些主要的状态,以及这些状态是如何切换的。
简述
应用程序有 Not Running(未运行),Inactive(未激活),Active(激活), Background(后台),Suspended(挂起)五个状态,当状态即将改变或已经改变时,会发送相应通知并在AppDelegate中会执行相应的回调,开发中需要视需求,在状态变换的回调方法中,添加相应的处理。
概览
要点
- Not Running和Suspended是APP未运行时的两种状态,在APP的抽象对象UIApplication的的
applicationState
中没有这两种状态,也没有相应的通知和AppDelegate回调; - 需要注意区分APP在刚启动和返回前台时分别触发的
applicationDidBecomeActive:
; - APP进入后台前会先进入未激活状态
applicationWillResignActive:
; - 一般的APP(没有特殊Background Modes的APP)进入后台有5s时间执行代码,之后会被挂起;
- 进入后台后通过
beginBackgroundTaskWithExpirationHandler:
可申请180s的时间- 申请后台任务需和结束后台任务
endBackgroundTask:
需成对出现;
- 申请后台任务需和结束后台任务
- 挂起的APP依然在内存中,但可能被系统终止,内存不足时系统优先清理内存大的挂起APP;
- APP将要被终止(非崩溃)时会调用
applicationWillTerminate:
,有5s的任务执行时间。
详细
APP开始运行之后会根据配置文件info.plist创建APP的抽象对象–UIApplication,这是一个完全单例,在运行期间有且只会有一个,Not Running和Suspended是APP运行期之外的状态,UIApplication对象的applicationState
属性中运行时的三种状态:active、inactive和background,当APP运行时的状态将要或已经发生变化时,会发送通知并通过代理模式回调AppDelegate中的方法,由通知接受者或AppDelegate做相应的处理。
ApplicationState
APP未运行时的两种状态Not Running和Suspended对于编程没多少意义,需要关心的正是UIApplication对象中applicationState
的状态切换,需要清楚的有以下几点:
- APP完成加载前是inactive,完成加载后即进入active状态
- 回调1:
application:willFinishLaunchingWithOptions:
- 回调2:
application:didFinishLaunchingWithOptions:
- 回调3:
applicationDidBecomeActive:
- 回调1:
- APP被中断时会进入inactive状态,结束中断时返回active状态
- 回调1:
applicationWillResignActive:
- 回调2:
applicationDidBecomeActive:
- 回调1:
- 锁屏和home按键也都是中断,所以APP在进入后台前会先进入inactive
- 回调1:
applicationWillResignActive:
- 回调2:
applicationDidEnterBackground:
- 回调1:
- 从后台返回前台,APP会重新进入active状态
- 回调1:
applicationWillEnterForeground:
- 回调2:
applicationDidBecomeActive:
- 回调1:
- 普通APP进入后台一段时间后会被挂起,被挂起的APP可能会被系统终止
- 回调:
applicationWillTerminate:
- 回调:
上述回调方法对应的的APP通知有:
- UIApplicationDidFinishLaunchingNotification;
- UIApplicationDidEnterBackgroundNotification
- UIApplicationWillEnterForegroundNotification
- UIApplicationDidBecomeActiveNotification;
- UIApplicationWillResignActiveNotification;
- UIApplicationWillTerminateNotification;
Background Modes
APP进入后台后可以按创建时指定的特殊后台运行模式运行,APP可以拥有多种后台运行模式,但审核时如果被认为APP无需所声明的后台运行模式,则审核会被拒。后台模式可以通过info.plist中的Required background modes进行配置,也可以通过Capabilities->Background Modes进行配置(推荐方式),APP的后台模式如下:
- Audio, AirPlay and Picture in Picture
- info.plist key: App plays audio or streams audio/video using AirPlay
- 音频播放、录制、使用AirPlay投放,画中画(iPad),此类APP可以后台常驻
- Location updates
- info.plist key: App registers for location updates
- 后台获取定位更新,此类APP也可以后台常驻
- Voice over IP
- info.plist key: App provides Voice over IP services
- IP电话,此类APP同样会被挂起,但系统会接管其通信socket,当socket中有数据传来时,会唤醒APP并交回socket
- Newsstand downloads
- info.plist key: App processes Newsstand Kit downloads
- 杂志类应用,此类APP会被挂起和终止,但可使用NKAssetDownload后台下载杂志,并在下载成功后重新唤醒或启动APP
- External Accessory communication
- info.plist key: App communicates with an accessory
- 与MFi外设通信类APP,在外设消息到达时APP会被唤醒,有10s的执行时间
- Uses Bluetooth LE accessories
- info.plist key: App communicates using CoreBluetooth
- 与Bluetooth LE设备通信类APP,在设备的消息到达时会被唤醒,有10s的执行时间
- Acts as a Bluetooth LE accessory
- info.plist key: App shares data using CoreBluetooth
- 自身作为蓝牙外设的应用,此类APP可以后台常驻,但需要用户授权
- Background fetch
- info.plist key: App downloads content from the network
- 后台定时更新,设置时间间隔,在间隔时间内启动应用更新数据,有30s执行时间
- Remote notifications
- info.plist key: App downloads content in response to push notifications
- 静默推送,在静默推送到底时,回调对应方法下载内容,有30s执行时间
- Background processing
- info.plist key: App processes data in the background
- 基于NSURLSession的后台传输,任务成功或失败时,APP会被唤醒并执行
application:handleEventsForBackgroundURLSession:completionHandler:
回调