1. 程式人生 > >iOS12下APP進入後臺後再返回前臺連線斷開

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

 

雖然給的回覆是問題出在蘋果那邊,但是也不知道蘋果啥時候解決這個問題,所以遇到的問題還得解決,最後推測是退到後臺的時候系統掛起了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);
  
}

這樣App就不會一進入後臺就會被掛起