前言
iOS提供了后台任务的机制,利用后台任务,App可以在用户退后台后有一小段时间进行一些必要的逻辑处理(经过测试在iOS15.4,大概是30秒左右,也就是说大概30秒左右的时间内,app是可以正常运行一些任务的,过了这段时间,就不能执行任何任务了)。
以下两个API用来新建和结束后台任务。
//新建一个后台任务(handler中可以调用兜底的endBackgroundTask)
- (UIBackgroundTaskIdentifier)beginBackgroundTaskWithExpirationHandler:(void (^)(void))handler;
//结束后台任务 —— 必须调用,否则系统会杀死App
- (void)endBackgroundTask:(UIBackgroundTaskIdentifier)identifier;`
最终效果如下
-
没有优化前的效果(退到后台
before9.gif30秒
左右,app被杀,app就会重新加载启动图,进入登录界面,必现的)
-
优化后的效果 (退到后台后,
after.gif3~10分钟
后,也不会被杀,至于在后台更长时间会不会被杀,这个没有测试)
几个坑点
-
结束后台任务 —— 必须调用,否则系统会杀死App;也就是如果只调用了
beginBackgroundTaskWithExpirationHandler
方法,而不去调用endBackgroundTask
的话,系统会在app退到后台30秒左右后,把app杀掉,app就会冷重启,之前的状态全部丢失。 -
如果调了
beginBackgroundTask
而未在系统分配的时间配额用尽时调用相应的endBackgroundTask
,系统就会杀掉App进程。也就是说,必须要在30秒左右之内及时调用
,endBackgroundTask
,否则系统会在app退到后台30秒左右后,把app杀掉,app就会冷重启,之前的状态全部丢失。
建议
- 没有必要执行后台任务时,就不要调用上面的方法,这样自然不会触发 系统会在app退到后台30秒左右后,把app杀掉
- 在真的需要使用后台任务时,建议使用方法如下:
//1. 新建一个后台任务
__block UIBackgroundTaskIdentifier taskId;
taskId = [[UIApplication sharedApplication] beginBackgroundTaskWithName:@"TaskID"
expirationHandler:^{
//4.兜底逻辑写在这里,结束后台任务,防止系统分配的时间配额用尽时后台任务业务逻辑仍未执行完(保证app在任务没有执行完成时,也不会被系统杀掉)
[[UIApplication sharedApplication] endBackgroundTask:taskId];
}];
//2. 执行后台任务主要逻辑写下面
//todo...
//3. 后台任务业务逻辑执行完成后,结束后台任务
[[UIApplication sharedApplication] endBackgroundTask:taskId];
结尾
今天的分享至此接近尾声喽,小伴们,觉得有点用的话,或者已经看到这里面来的请点赞加关注吧~~
后续分享更多iOS原生技术及物联网技术相关文章。如果有任何疑问的话,欢迎在下方留言~
网友评论