专栏首页freesan44iOS12 切换到后台请求丢失的问题

iOS12 切换到后台请求丢失的问题

前言

iOS12版本后,AFNetworking请求过程中,app返回后台,会出现以下错误,并且网络请求中断(只在真机中出现,模拟器不会复现)

HTTP load failed (error code: 53 [1:53])
2018-08-30 11:54:43.390749+0200 Background[2224:809685] Task <7CD7B0DD-2CE2-400D-AC02-D66C0F4E4847>.<7> finished with error - code: 53
2018-08-30 11:54:43.391271+0200 Background[2224:809125] Task <7CD7B0DD-2CE2-400D-AC02-D66C0F4E4847>.<7> load failed with error Error Domain=NSPOSIXErrorDomain Code=53 "Software caused connection abort" UserInfo={_NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <7CD7B0DD-2CE2-400D-AC02-D66C0F4E4847>.<7>, _kCFStreamErrorDomainKey=1, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalDataTask <7CD7B0DD-2CE2-400D-AC02-D66C0F4E4847>.<7>"
), _kCFStreamErrorCodeKey=53} [53]
failure The operation couldn’t be completed. Software caused connection abort

处理

此情况产生原因是苹果iOS12系统后台挂起逻辑更换了导致,苹果承诺在iOS13修复这个问题,但看情况应该不会修复

所以我们这边对这种情况进行处理,主要是在AppDelegate上: OC版:

@property (nonatomic, unsafe_unretained) UIBackgroundTaskIdentifier taskId;
@property (nonatomic, strong) NSTimer *timer;

- (void)applicationDidEnterBackground:(UIApplication *)application {
//   这个判断是为了防止进入后台之后时间还没过完进入前台又开启了新的任务导致APP被强制kill掉
   if(self.taskId != UIBackgroundTaskInvalid){
      return;
   }
   self.taskId =[application beginBackgroundTaskWithExpirationHandler:^(void) {
      //当申请的后台时间用完的时候调用这个block
      //此时我们需要结束后台任务,
      [self endTask];
   }];
   // 模拟一个长时间的任务 Task
   self.timer =[NSTimer scheduledTimerWithTimeInterval:1.0f
                                                target:self
                                              selector:@selector(longTimeTask:)
                                              userInfo:nil
                                               repeats:YES];
}
#pragma mark - 停止timer
-(void)endTask
{
   
   if (_timer != nil||_timer.isValid) {
      [_timer invalidate];
      _timer = nil;
      
      //结束后台任务
      [[UIApplication sharedApplication] endBackgroundTask:_taskId];
      _taskId = UIBackgroundTaskInvalid;
      
      // NSLog(@"停止timer");
   }
}
- (void) longTimeTask:(NSTimer *)timer{

   // 系统留给的我们的时间
   NSTimeInterval time =[[UIApplication sharedApplication] backgroundTimeRemaining];
   NSLog(@"系统留给的我们的时间 = %.02f Seconds", time);

}

swift版:

var backgroundTask: UIBackgroundTaskIdentifier = .invalid

func applicationWillResignActive(_ application: UIApplication) {
        backgroundTask = UIApplication.shared.beginBackgroundTask { [weak self] in
            self?.endBackgroundTask()
        }
  }

func endBackgroundTask() {
        print("Background task ended.")
        UIApplication.shared.endBackgroundTask(backgroundTask)
        backgroundTask = .invalid
    }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • LeetCode 155. 最小栈

    设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。

    freesan44
  • ReactiveCocoa使用心得

    5.NSMutableArray 因为NSMutableArray不支持KVO,所以用另外一个方式处理:

    freesan44
  • iOS多个线程发起相同请求,避免重复

    有时候在调用多个模块时,会对同一个API进行多次请求,但因为内容都是一样的,所以最好就是加上锁,防止重复请求造成网络资源浪费

    freesan44
  • 关于产品那些事

    上面是 Urban Dictionary 对 Badass 的英文解释,非常到位。Badass = bad + ass,bad 是“坏的”,ass 是“屁股、愚...

    Jean
  • 【前端词典】分享 8 个有趣且实用的 API

    这些 API 的示例代码我已放在 github 上了,地址:https://github.com/wanqihua/The-dictionary-of-fron...

    小生方勤
  • 语音关键词检测方法综述【附PPT与视频资料】

    随着智能音箱、语音助手等应用的出现,普通人也可以像科幻场景一样使用语音与机器进行交流。语音关键词检测是实现人机语音交互的重要技术,被广泛地应用于各类智能设备、语...

    马上科普尚尚
  • 十分钟教你开发EOS智能合约

    区块链大本营
  • VueJS + Webpack 代码分割的三种方式

    对单页应用实行代码分割,是提高页面加载速度的一种很好的方式。因为用户不必在一次请求里加载完所有的代码,能够更快的看到页面并进行交互,这将会提升用户体验(特别是在...

    疯狂的技术宅
  • js常用方法和一些封装 -- 时间相关(附案例详解)

    剽悍一小兔
  • 关于java中死锁的总结

    关于死锁,估计很多程序员都碰到过,并且有时候这种情况出现之后的问题也不是非常好排查,下面整理的就是自己对死锁的认识,以及通过一个简单的例子来来接死锁的发生,自己...

    coders

扫码关注云+社区

领取腾讯云代金券