背景
iOS提供了后台任务的机制,利用后台任务,App可以在用户退后台时有几秒的时间进行一些必要的逻辑处理。
以下两个API
用来新建和结束后台任务。
//新建一个后台任务(handler中可以调用兜底的endBackgroundTask)
- (UIBackgroundTaskIdentifier)beginBackgroundTaskWithExpirationHandler:(void (^)(void))handler;
//结束后台任务 —— 必须调用,否则系统会杀死App
- (void)endBackgroundTask:(UIBackgroundTaskIdentifier)identifier;`
坑点
苹果文档中明确指出,如果调了 beginBackgroundTask
而未在系统分配的时间配额用尽时调用相应的endBackgroundTask
,系统就会杀掉App
进程[1]。
很多大厂的App
都出现过因管控不严或逻辑问题endBackgroundTask
未被(及时)调用的情况。结果就是用户一切后台,再打开时就已经是重启App
的状态了,一方面打开时间变长,另一方面之前的状态也丢失了,用户体验负面影响较大。
建议
-
在新建后台任务后,保证在正常业务逻辑处理完后调用
endBackgroundTask
方法; -
在
beginBackgroundTaskWithExpirationHandler
方法的handler
回调中调用endBackgroundTask
方法进行兜底,以防止正常业务逻辑在系统允许的时间内未完成。
handler
中不要放耗时逻辑,最好只放endBackgroundTask
的调用
使用示例:
//1. 新建后台任务
__block UIBackgroundTaskIdentifier taskId;
taskId = [[UIApplication sharedApplication] beginBackgroundTaskWithName:@"myTask"
expirationHandler:^{
//3.b 兜底逻辑,结束后台任务,防止系统分配的时间配额用尽时后台任务业务逻辑仍未执行完
[[UIApplication sharedApplication] endBackgroundTask:taskId];
}];
//2. 执行后台任务业务逻辑
//...
//3.a 后台任务业务逻辑执行完成后,结束后台任务
[[UIApplication sharedApplication] endBackgroundTask:taskId];
参考资料
[1] developer.apple.com/documentati…