iOS12下APP进入后台后再返回前台连接断开

最近无意中发现了一个问题,在release环境下,APP在iOS12的时候退到后台然后再返回到前台的时候网络请求返回错误,AFN返回错误码53,NSPOSIXErrorDomain Code=53: Software caused connection abort。但是在Debug环境下却没发现这个问题,其他系统版本下也没有问题,所有就怀疑是不是iOS12的原因。
最后在github上 AFNetworking的留言中发现了国外的开发者也遇到了这个问题,并且给苹果发了邮件,也收到了苹果的回复,https://github.com/AFNetworking/AFNetworking/issues/4279

3F216115-278C-482E-8FF0-C9DE1C1E5152.png

 

虽然给的回复是问题出在苹果那边,但是也不知道苹果啥时候解决这个问题,所以遇到的问题还得解决,最后推测是退到后台的时候系统挂起了APP,既然有10分钟,那么就一定要争取到!所以申请后台任务:
1.在工程的AppDelegate文件中

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

2.在AppDelegate中的- (void)applicationDidEnterBackground:(UIApplication *)application 方法中

self.taskId =[application beginBackgroundTaskWithExpirationHandler:^(void) {
        //当申请的后台时间用完的时候调用这个block
        //此时我们需要结束后台任务,
        [self endTask];
    }];
// 模拟一个长时间的任务 Task
 self.timer =[NSTimer scheduledTimerWithTimeInterval:1.0f
                                                   target:self
                                                 selector:@selector(longTimeTask:)
                                                 userInfo:nil
                                                  repeats:YES];

3.结束后台任务
后台任务结束的时候要释放定时器

#pragma mark - 停止timer
-(void)endTask
{

    if (_timer != nil||_timer.isValid) {
        [_timer invalidate];
        _timer = nil;
        
        //结束后台任务
        [[UIApplication sharedApplication] endBackgroundTask:taskId];
        taskId = UIBackgroundTaskInvalid;
        
        NSLog(@"停止timer");
    }
}

4.模拟的长时间后台任务

- (void) longTimeTask:(NSTimer *)timer{
    
    // 系统留给的我们的时间
    NSTimeInterval time =[[UIApplication sharedApplication] backgroundTimeRemaining]; 
    NSLog(@"系统留给的我们的时间 = %.02f Seconds", time);
  
}

这样就解决了这个问题,不会一进入后台就会被挂起



作者:千里马_42195
链接:https://www.jianshu.com/p/1401a709a7c6
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值