iOS App后台保活

本文详细介绍了iOS App在不同系统版本下的运行状态变化,并探讨了多种后台保活方法,包括使用beginBackgroundTask、播放无声音乐、后台定位、后台下载资源以及iOS13+的BackgroundTasks。通过实例代码展示了如何在不同系统版本中实现短时间后台保活,以及如何利用AVAudioPlayer、Location updates和Background Modes来维持App后台运行。此外,还提到了后台下载资源和使用BGTaskScheduler在iOS13+中进行后台任务调度。
摘要由CSDN通过智能技术生成

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!&#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值