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

2022-02-08  本文已影响0人  路漫漫其修远兮Wzt

作者: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的状态了,一方面打开时间变长,另一方面之前的状态也丢失了,用户体验负面影响较大。

建议

  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…

上一篇 下一篇

猜你喜欢

热点阅读