Я использую NSURLSessionDownloadTask
с фоновыми сеансами для выполнения всех моих запросов REST. Таким образом, я могу использовать один и тот же код, не задумываясь о том, что мое приложение находится в фоновом режиме или на переднем плане.
Мой конец был мертв некоторое время, и я воспользовался этой возможностью, чтобы проверить, как NSURLSession
ведет себя с тайм-аутами.
К моему большому удивлению, ни один из моих обратных вызовов NSURLSessionTaskDelegate
никогда не вызван. Независимо от тайм-аута, который я установил на NSURLRequest
или на NSURLSessionConfiguration
, я никогда не получаю обратный вызов от iOS, говорящий мне, что запрос закончил с таймаутом.
То есть, когда я запускаю NSURLSessionDownloadTask
на фоновом сеансе. Такое поведение происходит, когда приложение находится в фоновом режиме или на переднем плане.
Пример кода:
- (void)launchDownloadTaskOnBackgroundSession {
NSString *sessionIdentifier = @"com.mydomain.myapp.mySessionIdentifier";
NSURLSessionConfiguration *backgroundSessionConfiguration = [NSURLSessionConfiguration backgroundSessionConfiguration:sessionIdentifier];
backgroundSessionConfiguration.requestCachePolicy = NSURLRequestReloadIgnoringCacheData;
backgroundSessionConfiguration.timeoutIntervalForRequest = 40;
backgroundSessionConfiguration.timeoutIntervalForResource = 65;
NSURLSession *backgroundSession = [NSURLSession sessionWithConfiguration:backgroundSessionConfiguration delegate:self delegateQueue:[NSOperationQueue mainQueue]];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.timeout.com/"]];
request.timeoutInterval = 30;
NSURLSessionDownloadTask *task = [backgroundSession downloadTaskWithRequest:request];
[task resume];
}
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
NSLog(@"URLSession:task:didCompleteWithError: id=%d, error=%@", task.taskIdentifier, error);
}
Однако, когда я использую сеанс по умолчанию, я получаю обратный вызов ошибки через 30 секунд (тайм-аут, который я установил на уровне запроса).
Пример кода:
- (void)launchDownloadTaskOnDefaultSession {
NSURLSessionConfiguration *defaultSessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
defaultSessionConfiguration.requestCachePolicy = NSURLRequestReloadIgnoringCacheData;
defaultSessionConfiguration.timeoutIntervalForRequest = 40;
defaultSessionConfiguration.timeoutIntervalForResource = 65;
NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration:defaultSessionConfiguration delegate:self delegateQueue:[NSOperationQueue mainQueue]];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.timeout.com/"]];
request.timeoutInterval = 30;
NSURLSessionDownloadTask *task = [defaultSession downloadTaskWithRequest:request];
[task resume];
}
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
NSLog(@"URLSession:task:didCompleteWithError: id=%d, error=%@", task.taskIdentifier, error);
}
Я не могу найти в документации ничего, что говорит о том, что тайм-аут должен вести себя по-разному при использовании фоновых сеансов.
Кто-нибудь столкнулся с этим вопросом? Это ошибка или функция?
Я рассматриваю возможность создания отчета об ошибке, но обычно я получаю обратную связь намного быстрее на SO (несколько минут), чем на репортера ошибок (шесть месяцев).
Привет,