美文网首页
iOS app退到后台被杀相关问题

iOS app退到后台被杀相关问题

作者: 微风_10a5 | 来源:发表于2022-05-05 11:45 被阅读0次
    前言

    iOS提供了后台任务的机制,利用后台任务,App可以在用户退后台后有一小段时间进行一些必要的逻辑处理(经过测试在iOS15.4,大概是30秒左右,也就是说大概30秒左右的时间内,app是可以正常运行一些任务的,过了这段时间,就不能执行任何任务了)。

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

    //新建一个后台任务(handler中可以调用兜底的endBackgroundTask)
    - (UIBackgroundTaskIdentifier)beginBackgroundTaskWithExpirationHandler:(void (^)(void))handler;
    
    //结束后台任务 —— 必须调用,否则系统会杀死App
    - (void)endBackgroundTask:(UIBackgroundTaskIdentifier)identifier;`
    
    最终效果如下
    • 没有优化前的效果(退到后台30秒左右,app被杀,app就会重新加载启动图,进入登录界面,必现的)

      before9.gif
    • 优化后的效果 (退到后台后,3~10分钟后,也不会被杀,至于在后台更长时间会不会被杀,这个没有测试)

      after.gif
    几个坑点
    • 结束后台任务 —— 必须调用,否则系统会杀死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原生技术及物联网技术相关文章。如果有任何疑问的话,欢迎在下方留言~

    相关文章

      网友评论

          本文标题:iOS app退到后台被杀相关问题

          本文链接:https://www.haomeiwen.com/subject/bhunyrtx.html