【常见问题】iOS 后台任务使用不当导致的退后台被杀

1,088 阅读1分钟

背景

iOS提供了后台任务的机制,利用后台任务,App可以在用户退后台时有几秒的时间进行一些必要的逻辑处理。

以下两个API用来新建和结束后台任务。

//新建一个后台任务(handler中可以调用兜底的endBackgroundTask)
- (UIBackgroundTaskIdentifier)beginBackgroundTaskWithExpirationHandler:(void (^)(void))handler;

//结束后台任务 —— 必须调用,否则系统会杀死App
- (void)endBackgroundTask:(UIBackgroundTaskIdentifier)identifier;`

坑点

苹果文档中明确指出,如果调了 beginBackgroundTask而未在系统分配的时间配额用尽时调用相应的endBackgroundTask,系统就会杀掉App进程[1]

很多大厂的App都出现过因管控不严或逻辑问题endBackgroundTask未被(及时)调用的情况。结果就是用户一切后台,再打开时就已经是重启App的状态了,一方面打开时间变长,另一方面之前的状态也丢失了,用户体验负面影响较大。

建议

  1. 在新建后台任务后,保证在正常业务逻辑处理完后调用endBackgroundTask方法;

  2. 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…

最后,欢迎大家关注我的微信公众号,有空多多交流