1.App 运行状态、及状态变化
1.1不低于iOS13.0的设备端App 运行状态
iOS13.0+的设备,支持多场景,共有上图中的Unattached、Foreground Inactive、Foreground Active、Forground Inactive、Background、Suspended 6种状态。
Unattached:多个场景的情况,如果创建的场景不是当前显示的场景,那么场景处于Unattached状态;
Foreground Inactive:应用启动后,显示启动图的过程中,处于Foreground Inactive状态;
Forground Active:应用启动后,显示出来我们设置的rootViewController之后,场景处于Forground Active;
Foreground Inactive:应用启动后,场景处于显示状态,数据加载完毕,且用户和App没有交互过程中,处于Forground Inactive状态;
Background:用户点击Home键、或者是切换App后、锁屏后,应用进入Background状态;
Suspended:进入Background后,应用的代码不执行后,应用进入Suspended状态;(代码是否在运行,可以在应用中写定时器,定时输出内容,从Xcode控制台,或Mac端控制台查看是否有输出内容来判断)
1.2低于iOS13.0的设备端App 运行状态
上图是低于iOS13.0的设备端App的运行状态,分别是Not Running、Foreground Inactive、Foreground Active、Forground Inactive、Background、Suspended 6种状态。
Not Running:指用户没有启动App,或用户Terminate App 后,App处于的状态;其他的五种状态和不低于iOS13.0的设备端App的运行状态意义相同。
1.3App 进入后台状态变化
笔者写了个定时器,定时输出“普通定时器进行中”,可以看到,应用进入后台后,基本上立刻,就没有内容输出了。笔者认为可以认为此时App 已经进入Suspended的状态。
下边笔者介绍下,尝试的App后台保活方式。
2.iOS App 后台保活方式简介
2.1短时间App后台保活
beginBackgroundTaskWithName` 和 `endBackgroundTask
笔者尝试过使用相关API,测试过2款手机。
对于系统版本低于iOS13(iOS 12.3)的设备(iPhone6 Plus)后台运行时间约3分钟(175秒);
对于系统版本不低于iOS13(iOS 13.0)的设备(iPhone6 Plus)后台运行时间约31秒;
2.2播放无声音乐
App 进入后台后,播放无声音乐,适用于音视频类App。
笔者对逆向不了解,从iOS项目技术还债之路《一》后台下载趟坑中得知,腾讯视频、爱奇艺采用了播放无声音乐保活的方式。
2.3后台持续定位
对于定位类App,持续定位App,可以实现App后台保活。定位类App需要后台保活,像系统的地图应用,在导航的时候切换App的时候,就需要后台保活。
2.4后台下载资源
对于需要下载资源的App,需要后台下载资源,如我们在某App下载资源的时候,我们希望在切换App时候,或者App退出后台后,资源仍然继续下载,这样当我们打开App的时候,资源已经下载好了。
2.5BackgroundTasks
BackgroundTasks.framework 是iOS13新增的framework,笔者认为此framework中的API可以在信息流类的App中发挥作用。
3.短时间App后台保活
3.1系统版本低于iOS13.0的设备
系统版本低于iOS13.0的设备,在应用进入后台的时候,开始后台任务([[UIApplication sharedApplication] beginBackgroundTaskWithName:)。在应用进入前台时或后台任务快过期的回调中,终止后台任务([[UIApplication sharedApplication] endBackgroundTask:)。
示例代码如下:
- (void)applicationDidEnterBackground:(UIApplication*)application {
self.backgroundTaskIdentifier= [[UIApplicationsharedApplication] beginBackgroundTaskWithName:kBgTaskNameexpirationHandler:^{
if (self.backgroundTaskIdentifier!&#