作者:zhangjiezhi_
链接:https://juejin.cn/post/6885721341224452103
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
背景
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];
复制代码








网友评论