风随花落 2019-06-27
按照苹果的要求,一个APP在完成相应的操作后,应该及时释放或停止对硬件或系统功能的控制。比如,一个APP需要根据不同的城市显示不同的首页内容,那么应该在获取到手机的当前城市后,主动停止定位。
iOS的后台机制共有三种:
先说第一种后台任务,其实就是一个APP刚退到后台时,可以向系统申请一段时间(一般几十秒)来处理一些任务,等任务处理完成再被系统挂起。比如一个地图软件,下载离线地图后,正在安装,用户此时按了Home键,那就可以向系统申请一段时间等安装完成后,再挂起。如果耗时超过系统限制,会被强制清理。
第二种后台下载,必须使用iOS指定的机制才可以,那就是NSURLSession来创建后台下载,即使你的APP已经进入后台,或被系统杀掉了,当下载完成时,系统会唤醒APP来处理下载好的文件。很多杂志类的应用会有这种功能。
第三种特殊后台情况比较多了:
1. 需要在后台播放音频。如音乐播放。会一直运行; 2. 需要在后台录音;会一直运行; 3. 在后台也需要不断通知用户位置变动的;比如导航APP会一直在后台运行,但地理围栏APP只会在进入和退出指定位置时唤醒APP; 4. 支持VoIP电话的,如Skype网络电话;会在有电话时被系统唤醒; 5. 需要在后台有规律的下载和处理网络内容的;会在指定时间或网络条件下被系统唤醒; 6. 在后台有规律的从其他外设(第三方配件)获取并更新数据的;会在收到配件消息时被系统唤醒
还需要注意的是,那些被系统后台唤醒的app并不是无限制的,大部分情况下被唤醒后只有10秒时间来处理任务,超时未完成处理会被系统强制挂起。
iOS为了控制后台任务,使用了AI技术,依靠人工智能来判断一个app应不应该被唤醒,唤醒频率是多少。已经不是你的app想要唤醒就能唤醒的了,如果手机电量不足或者被唤醒后你的app没有联网存取一些数据,或者总是超时被强制结束,那就不会再被唤醒。
还需要注意的是,绝大多数情况下,系统不会重启被用户手动强制关闭的 APP,但在 iOS 8 之后, location apps (地理围栏等)是个例外。其他的所有被用户手动强制关闭的APP 都不会被系统主动唤起,直到用户再次主动启动这个 APP,或者手机重启并在用户输入了解锁密码之后才会恢复机制。
苹果对后台功能要求很严格,要求开发能不用后台就不要用。
如果一定要用后台功能,需要给出说明和解释,让审核人员清楚地知道,app的哪个功能用到了后台模式。尤其是后台定位功能,因为涉及用户隐私,审核非常严格。
绝大部分软件是遵守苹果开发规范的,但是还是有一些app由于设计不良或出现bug,导致耗电量很大:
另外还有一些软件,故意钻空子,利用技术手段作弊,强行运行在后台,达到某些目的。尤其在iOS10之前的系统上很常见。
beginBackgroundTaskWithExpirationHandler:
向系统申请一段时间,然后再重复申请一段时间,就可以长时间在后台运行。而且被杀死后还有可能被系统重新唤醒。但是,现在iOS10和iOS11之后,这些方法也很难骗过审核人员和iOS系统的后台唤醒机制了。
" \ \ / /_ | / | _ \ / | / / _ | \ | | | / |. " \ \ / / | || |/| | |) | | | | | | | | | | | | | | _.