奇技指南
前段时间,笔者和GY哥一起吃饭聊天的时候,GY哥问了笔者一个问题,iOS App 可以后台保活吗?是如何做到后台保活的?当时笔者只想到了可以在后台播放静音的音乐,对于唤醒App,可以考虑使用推送的方式。GY哥提到播放静音文件会影响上线吗?这我就不大知道了…...由于没有相关实践,笔者后来在网上查了相关资料,总结了本文。
本文转载自公众号QiShare
笔者查询了相关资料后发现,iOS App可以实现后台保活。
短时间保活的方式有beginBackgroundTaskWithName;
App长时间保活的方式有:播放无声音乐、后台持续定位、后台下载资源、BGTaskScheduler等;
唤醒App的方式有:推送、VoIP等;
导读
本文分为如下几部分:
App 运行状态、及状态变化
- App 后台保活方式简介
- 短时间App后台保活
- Background Modes AVAudio,AirPlay,and Picture in Picture
- Background Modes Location updates
BGTaskScheduler (iOS13.0+)
App 运行状态、及状态变化
不低于iOS13.0的设备端App 运行状态
![165260a24a0992c7ad54cca330ada631.png](https://i-blog.csdnimg.cn/blog_migrate/0d01df0aec3e5ca17d8360c25d77f739.png)
- 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端控制台查看是否有输出内容来判断)
低于iOS13.0的设备端App 运行状态
![3bba82016b3182b26b948260355c6d6f.png](https://i-blog.csdnimg.cn/blog_migrate/d6f629f565354db8267a0ee0f1959579.png)
低于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的运行状态意义相同。App 进入后台状态变化
笔者写了个定时器,定时输出“普通定时器进行中”,可以看到,应用进入后台后,基本上立刻,就没有内容输出了。笔者认为可以认为此时App 已经进入Suspended的状态。
![bfd816bc1049eacb3da5bab1136c93bf.png](https://i-blog.csdnimg.cn/blog_migrate/7af1a9714d41188d911f7148b01f6d23.jpeg)
2
iOS App 后台保活方式简介
短时间App后台保活
beginBackgroundTaskWithName 和 endBackgroundTask笔者尝试过使用相关API,测试过2款手机。对于系统版本低于iOS13(iOS 12.3)的设备(iPhone6 Plus)后台运行时间约3分钟(175秒);对于系统版本不低于iOS13(
iOS 13.0)的设备(iPhone6 Plus)后台运行时间约31秒;播放无声音乐
App 进入后台后,播放无声音乐,适用于音视频类App。笔者对逆向不了解,从iOS项目技术还债之路《一》后台下载趟坑中得知,腾讯视频、爱奇艺采用了播放无声音乐保活的方式。后台持续定位
对于定位类App,持续定位App,可以实现App后台保活。定位类App需要后台保活,像系统的地图应用,在导航的时候切换App的时候,就需要后台保活。后台下载资源
对于需要下载资源的App,需要后台下载资源,如我们在某App下载资源的时候,我们希望在切换App时候,或者App退出后台后,资源仍然继续下载,这样当我们打开App的时候,资源已经下载好了。BackgroundTasks
BackgroundTasks.framework 是iOS