I have this issue also, running on an iOS 8 device.
It is detailed some more here and seems to be a case of iOS trying to use connections that have already timed out.
My issue isn’t the same as the Keep-Alive problem explained in that link, however it seems to be the same end result.
I have corrected my problem by running a recursive block whenever I receive an error -1005 and this makes the connection eventually get through even though sometimes the recursion can loop for 100+ times before the connection works, however it only adds a mere second onto run times and I bet that is just the time it takes the debugger to print the NSLog’s for me.
Here’s how I run a recursive block with AFNetworking:
Add this code to your connection class file
// From Mike Ash's recursive block fixed-point-combinator strategy https://gist.github.com/1254684
dispatch_block_t recursiveBlockVehicle(void (^block)(dispatch_block_t recurse))
{
// assuming ARC, so no explicit copy
return ^{ block(recursiveBlockVehicle(block)); };
}
typedef void (^OneParameterBlock)(id parameter);
OneParameterBlock recursiveOneParameterBlockVehicle(void (^block)(OneParameterBlock recurse, id parameter))
{
return ^(id parameter){ block(recursiveOneParameterBlockVehicle(block), parameter); };
}
Then use it likes this:
+ (void)runOperationWithURLPath:(NSString *)urlPath
andStringDataToSend:(NSString *)stringData
withTimeOut:(NSString *)timeOut
completionBlockWithSuccess:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure
{
OneParameterBlock run = recursiveOneParameterBlockVehicle(^(OneParameterBlock recurse, id parameter) {
// Put the request operation here that you want to keep trying
NSNumber *offset = parameter;
NSLog(@"--------------- Attempt number: %@ ---------------", offset);
MyAFHTTPRequestOperation *operation =
[[MyAFHTTPRequestOperation alloc] initWithURLPath:urlPath
andStringDataToSend:stringData
withTimeOut:timeOut];
[operation setCompletionBlockWithSuccess:
^(AFHTTPRequestOperation *operation, id responseObject) {
success(operation, responseObject);
}
failure:^(AFHTTPRequestOperation *operation2, NSError *error) {
if (error.code == -1005) {
if (offset.intValue >= numberOfRetryAttempts) {
// Tried too many times, so fail
NSLog(@"Error during connection: %@",error.description);
failure(operation2, error);
} else {
// Failed because of an iOS bug using timed out connections, so try again
recurse(@(offset.intValue+1));
}
} else {
NSLog(@"Error during connection: %@",error.description);
failure(operation2, error);
}
}];
[[NSOperationQueue mainQueue] addOperation:operation];
});
run(@0);
}
You’ll see that I use a AFHTTPRequestOperation
subclass but add your own request code. The important part is calling recurse(@offset.intValue+1));
to make the block be called again.
У меня есть приложение, которое отлично работает на Xcode6-Beta1 и Xcode6-Beta2 с iOS7 и iOS8. Но с Xcode6-Beta3, Beta4, Beta5 я столкнулся с проблемами сети с iOS8, но все отлично работает на iOS7. Я получаю сообщение об ошибке "The network connection was lost."
. Ошибка следующая:
Ошибка: Ошибка домена = NSURLErrorDomain Code = -1005 «Сетевое соединение было потеряно». UserInfo = 0x7ba8e5b0 {NSErrorFailingURLStringKey =, _kCFStreamErrorCodeKey = 57, NSErrorFailingURLKey =, NSLocalizedDescription = Сетевое соединение было потеряно., _kCFStreamErrorDomainKey = 1, NSUnderlyingError = 0x7a6957e0 «Сетевое соединение было потеряно.» }
Я использую AFNetworking 2.x и следующий фрагмент кода для выполнения сетевого вызова:
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager setSecurityPolicy:policy];
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
[manager POST:<example-url>
parameters:<parameteres>
success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"Success: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
Я пробовал NSURLSession
, но все равно получаю ту же ошибку.
Ответ 1
Перезапуск симулятора исправил проблему для меня.
Ответ 2
У нас была именно эта ошибка, и она оказалась проблемой с базовой реализацией HTTP NSURLRequest
:
Насколько мы можем судить, когда iOS 8/9/10/11 получает HTTP-ответ с заголовком Keep-Alive
, она сохраняет это соединение для повторного использования позже (как и должно быть), но сохраняет его больше, чем Параметр timeout
заголовка Keep-Alive (кажется, он всегда поддерживает соединение в течение 30 секунд.) Затем, когда приложение отправляет второй запрос менее чем через 30 секунд, оно пытается повторно использовать соединение, которое могло быть сбрасывается сервером (если прошло больше, чем реальный Keep-Alive
).
Вот решения, которые мы нашли до сих пор:
- Увеличьте параметр времени ожидания сервера выше 30 секунд. Похоже, что iOS всегда ведет себя так, как будто сервер будет держать соединение открытым в течение 30 секунд, независимо от значения, указанного в заголовке Keep-Alive. (Это можно сделать для Apache, установив параметр
KeepAliveTimeout
. - Вы можете просто отключить механизм поддержания активности для клиентов iOS на основе User-Agent вашего приложения (например, для Apache:
BrowserMatch "iOS 8\." nokeepalive
в файле модаsetenvif.conf
) - Если у вас нет доступа к серверу, вы можете попробовать отправить ваши запросы с заголовком
Connection: close
: это скажет серверу немедленно прекратить соединение и ответить без заголовков поддержки активности. НО в настоящий момент NSURLSession, кажется, переопределяет заголовокConnection
при отправке запросов (мы не тестировали это решение всесторонне, так как мы можем настроить конфигурацию Apache)
Ответ 3
Для моего, Resetting content and settings
симулятора работает.
В reset симулятор выполнит следующие шаги:
iOS Simulator → reset Содержание и настройки → Нажмите reset (на предупреждение, которое придет)
Ответ 4
Время выполнения симулятора iOS 8.0 имеет ошибку, согласно которой, если ваша сетевая конфигурация изменяется при загрузке имитируемого устройства, API-интерфейсы более высокого уровня (например, CFNetwork) в моделируемой среде выполнения будут считать, что он потерял сетевое подключение. В настоящее время рекомендуемым решением является просто перезагрузка имитируемого устройства при изменении конфигурации сети.
Если вы столкнулись с этой проблемой, добавьте дополнительные дублированные радары в http://bugreport.apple.com, чтобы получить повышенный приоритет.
Если вы видите эту проблему, не изменив конфигурации сети, то это не известная ошибка, и вы обязательно должны указать радар, указав, что проблема не является известной ошибкой, измененной конфигурацией сети.
Ответ 5
Также есть проблема с бета 5 и AFNetworking 1.3 при работе на симуляторе iOS 8, которая приводит к ошибке соединения:
Domain = NSURLErrorDomain Code = -1005 «Сетевое соединение потеряно.»
Тот же самый код прекрасно работает на симуляторах iOS 7 и 7.1, и мой прокси-сервер отладки показывает, что сбой происходит до того, как на самом деле попытка подключения (т.е. Запросы не регистрируются).
Я отследил сбой NSURLConnection и сообщил об ошибке в Apple. Смотрите строку 5 на прикрепленном изображении:
.
Изменение использования https
позволяет подключаться к симуляторам iOS 8, хотя и с периодическими ошибками.
Проблема все еще присутствует в Xcode 6.01 (gm).
Ответ 6
для меня проблема заключалась в том, чтобы перезапустить симулятор и reset содержимое и настройки.
Ответ 7
Открытие Чарльза решило проблему для меня, что кажется очень странным…
Charles — это прокси-сервер HTTP/HTTP-монитор/обратный прокси-сервер, который позволяет разработчику просматривать весь трафик HTTP и SSL/HTTPS между их компьютером и Интернетом. Это включает в себя запросы, ответы и заголовки HTTP (которые содержат файлы cookie и информацию о кэшировании).
Ответ 8
Я столкнулся с этой проблемой при использовании Alamofire. Моя ошибка заключалась в том, что я отправлял пустой словарь [:]
для параметров по запросу GET
, а не по отправке параметров nil
.
Надеюсь, это поможет!
Ответ 9
См. комментарий pjebs от 5 января в Github.
Метод1:
if (error.code == -1005)
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
dispatch_group_t downloadGroup = dispatch_group_create();
dispatch_group_enter(downloadGroup);
dispatch_group_wait(downloadGroup, dispatch_time(DISPATCH_TIME_NOW, 5000000000)); // Wait 5 seconds before trying again.
dispatch_group_leave(downloadGroup);
dispatch_async(dispatch_get_main_queue(), ^{
//Main Queue stuff here
[self redoRequest]; //Redo the function that made the Request.
});
});
return;
}
Также некоторые предлагают повторно подключиться к сайту,
то есть. Сбой запроса POST TWICE
Решение. Используйте метод для подключения к сайту, return (id), если сетевое соединение было потеряно, верните его, чтобы использовать тот же метод.
Метод 2
-(id) connectionSitePost:(NSString *) postSender Url:(NSString *) URL {
// here set NSMutableURLRequest => Request
NSHTTPURLResponse *UrlResponse = nil;
NSData *ResponseData = [[NSData alloc] init];
ResponseData = [NSURLConnection sendSynchronousRequest:Request returningResponse:&UrlResponse error:&ErrorReturn];
if ([UrlResponse statusCode] != 200) {
if ([UrlResponse statusCode] == 0) {
/**** here re-use method ****/
return [self connectionSitePost: postSender Url: URL];
}
} else {
return ResponseData;
}
}
Ответ 10
Я тоже получал эту ошибку, но на реальных устройствах, а не на симуляторе. Мы заметили ошибку при доступе к нашему серверу heroku на HTTPS (сервер gunicorn) и сделали POSTS с большими bodys (что-то более 64Kb). Мы используем HTTP Basic Auth для аутентификации и заметили, что ошибка была решена НЕ используя метод делегата didReceiveChallenge:
на NSURLSession, а скорее выпекаем в аутентификации в исходный заголовок запроса, добавив Authentiation: Basic <Base64Encoded UserName:Password>
. Это предотвращает необходимость 401 для запуска сообщения делегата didReceiveChallenge:
, а последующее сетевое соединение потеряно.
Ответ 11
У меня была такая же проблема. Решение было простым, я установил HTTPBody
, но не установил HTTPMethod
в POST
. После исправления все было в порядке.
Ответ 12
У меня такая же проблема. Я не знаю, как AFNetworking реализует запрос https, но причина для меня — проблема с кешем NSURLSession.
После отслеживания моего приложения из safari и последующей отправки запроса http появится сообщение «Ошибка загрузки http 1005». Если я перестану использовать "[NSURLSession sharedSession]"
, но использовать настраиваемый экземпляр NSURLSession для вызова метода «dataTaskWithRequest:» следующим образом, проблема будет решена.
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
config.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
config.URLCache = nil;
self.session = [NSURLSession sessionWithConfiguration:config];
Просто не забудьте установить config.URLCache = nil;
,
Ответ 13
Мне пришлось выйти из XCode, удалить содержимое папки DerivedData (~/Library/Developer/Xcode/DerivedData или /Library/Developer/Xcode/DerivedData ) и выйти из симулятора, чтобы сделать эту работу.
Ответ 14
У меня тоже есть эта проблема, работающая на устройстве iOS 8.
Здесь подробно описано и, похоже, это случай, когда iOS пытается использовать соединения, которые уже были отключены.
Моя проблема не совпадает с проблемой Keep-Alive, описанной в этой ссылке, однако, похоже, это тот же конечный результат.
Я исправил свою проблему, запустив рекурсивный блок всякий раз, когда получаю сообщение об ошибке -1005, и это приводит к тому, что соединение в конечном итоге проходит, хотя иногда рекурсия может зацикливаться на 100 раз, прежде чем соединение будет работать, однако оно добавляет просто второй — во время выполнения, и я уверен, что это всего лишь время, когда отладчик должен распечатать NSLog для меня.
Вот как я запускаю рекурсивный блок с AFNetworking:
Добавьте этот код в файл класса подключения
// From Mike Ash recursive block fixed-point-combinator strategy https://gist.github.com/1254684
dispatch_block_t recursiveBlockVehicle(void (^block)(dispatch_block_t recurse))
{
// assuming ARC, so no explicit copy
return ^{ block(recursiveBlockVehicle(block)); };
}
typedef void (^OneParameterBlock)(id parameter);
OneParameterBlock recursiveOneParameterBlockVehicle(void (^block)(OneParameterBlock recurse, id parameter))
{
return ^(id parameter){ block(recursiveOneParameterBlockVehicle(block), parameter); };
}
Затем использовать его нравится это:
+ (void)runOperationWithURLPath:(NSString *)urlPath
andStringDataToSend:(NSString *)stringData
withTimeOut:(NSString *)timeOut
completionBlockWithSuccess:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure
{
OneParameterBlock run = recursiveOneParameterBlockVehicle(^(OneParameterBlock recurse, id parameter) {
// Put the request operation here that you want to keep trying
NSNumber *offset = parameter;
NSLog(@"--------------- Attempt number: %@ ---------------", offset);
MyAFHTTPRequestOperation *operation =
[[MyAFHTTPRequestOperation alloc] initWithURLPath:urlPath
andStringDataToSend:stringData
withTimeOut:timeOut];
[operation setCompletionBlockWithSuccess:
^(AFHTTPRequestOperation *operation, id responseObject) {
success(operation, responseObject);
}
failure:^(AFHTTPRequestOperation *operation2, NSError *error) {
if (error.code == -1005) {
if (offset.intValue >= numberOfRetryAttempts) {
// Tried too many times, so fail
NSLog(@"Error during connection: %@",error.description);
failure(operation2, error);
} else {
// Failed because of an iOS bug using timed out connections, so try again
recurse(@(offset.intValue+1));
}
} else {
NSLog(@"Error during connection: %@",error.description);
failure(operation2, error);
}
}];
[[NSOperationQueue mainQueue] addOperation:operation];
});
run(@0);
}
Вы увидите, что я использую подкласс AFHTTPRequestOperation
, но добавляю свой собственный код запроса. Важной частью является вызов recurse(@offset.intValue+1));
для повторного вызова блока.
Ответ 15
Я получал ошибку на устройстве iOS 7, когда я использовал бета-версию Xcode 6.2.
Переход с бета-версии Xcode 6.2 на 6.1.1 исправил проблему, по крайней мере, на устройстве iOS 7.
Ответ 16
Если проблема возникает на устройстве, проверьте, проходит ли трафик через прокси (Настройки > Wi-Fi > (информация) > HTTP-прокси). У меня была настройка устройства для использования с Чарльзом, но я забыл про прокси. Кажется, что без того, чтобы Чарльз действительно выполнял эту ошибку.
Ответ 17
Если кто-то получает эту ошибку при загрузке файлов на серверный сервер, убедитесь, что на принимающем сервере установлен максимальный размер содержимого, допустимый для вашего носителя. В моем случае для NGINX требуется более высокий client_max_body_size
. NGINX отклонил запрос до того, как будет выполнена загрузка, поэтому код ошибки не вернулся.
Ответ 18
На 2017-01-25
Apple выпустила технический Q & A относительно этой ошибки:
Технические вопросы и ответы Apple QA1941
Обработка ошибок «сетевое соединение потеряно»
A: NSURLErrorNetworkConnectionLost является ошибкой -1005 в домене ошибок NSURLErrorDomain и отображается для пользователей как «Сетевое соединение было потеряно». Эта ошибка означает, что базовое TCP-соединение, несущее HTTP-запрос, отключено во время выполнения HTTP-запроса (дополнительную информацию об этом см. Ниже). В некоторых случаях NSURLSession может повторять такие запросы автоматически (в частности, если запрос идемпотентен), но в других случаях, которые не допускаются стандартами HTTP.
https://developer.apple.com/library/archive/qa/qa1941/_index.html#//apple_ref/doc/uid/DTS40017602
Ответ 19
Получил проблему в течение нескольких месяцев и, наконец, обнаружил, что когда мы отключили DNSSEC в нашем домене api, все было в порядке:
Ответ 20
Я подключался через VPN. Отключение VPN решило проблему.
Ответ 21
Я ударил эту ошибку при передаче NSURLRequest в NSURLSession без установки запроса HTTPMethod.
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:urlComponents.URL];
Ошибка домена = NSURLErrorDomain Code = -1005 «Сетевое соединение было потеряно».
Добавьте HTTPMethod
, хотя соединение прекрасно работает
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:urlComponents.URL];
[request setHTTPMethod:@"PUT"];
Ответ 22
Проверьте, можете ли вы запросить другие приложения (например, сафари). Если это не может быть что-то на вашем компьютере. В моем случае у меня была эта проблема с Avast Antivirus, которая блокировала мой запрос симуляторов (не спрашивайте меня почему).
Ответ 23
Перезапуск компьютера исправил проблему для меня с помощью Xcode9.1. Я перезапустил симулятор и Xcode, он не работает.
Ответ 24
У меня была эта проблема по следующей причине.
TL;DR: Проверьте, отправляется ли запрос GET
, который должен отправлять параметры на URL, а не в свойстве NSURLRequest HTTBody
.
=============================================== ===
Я установил сетевую абстракцию в своем приложении, и он работал очень хорошо для всех моих запросов.
Я добавил новый запрос на другой веб-сервис (не мой), и он начал бросать мне эту ошибку.
Я пошел на детскую площадку и начал с нуля строить строгий запрос, и это сработало. Поэтому я начал приближаться к своей абстракции, пока не нашел причину.
У моей реализации абстракции была ошибка:
Я отправил запрос, который должен был отправить параметры, закодированные в URL-адресе, и я также заполнил свойство NSURLRequest HTTBody
параметрами запроса.
Как только я удалил HTTPBody
, он сработал.
Ответ 25
Я получал эту ошибку и также замечаю, что приложение Postman также падало, но работало в приложении Advanced Rest Client (ARC) и работало в Android.
Поэтому мне пришлось установить Charles для отладки сообщения, и я замечаю, что код ответа был -1.
Проблема заключалась в том, что программист REST забыл вернуть код ответа 200.
Я надеюсь, что это поможет другим разработчикам.
Ответ 26
Всякий раз, когда появляется ошибка -1005, необходимо снова вызвать API.
AFHTTPRequestOperationManager *manager =
[AFHTTPRequestOperationManager manager];
[manager setSecurityPolicy:policy];
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
[manager POST:<example-url>
parameters:<parameteres>
success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"Success: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
if (error.code == -1005) {
// Call method again...
}
}];
Вам нужно добавить свой код, чтобы снова вызвать функцию. Убедитесь, что вы вызывали метод один раз, иначе вызовите рекурсивный цикл.
Ответ 27
Я столкнулся с той же проблемой, я включил Network Link Conditioner для медленного тестирования сети для приложения. Это создавало эту ошибку несколько раз. Когда я отключил ее в Settings > Developer > Network Link Conditioner
, это решило мою проблему.
Надеюсь, это поможет кому-то.
Ответ 28
Я столкнулся с той же проблемой, когда звонил, используя сервер своей компании из приложения iOS 12 с физического устройства. Проблема заключалась в том, что жесткий диск сервера был заполнен. Освобождение места на сервере решило проблему.
Я обнаружил ту же ошибку в другой ситуации, которую я считаю из-за тайм-аута, который нельзя параметризировать через стандартный сетевой API, предоставляемый Apple (URLSession.timeoutIntervalForRequest
и URLSession.timeoutIntervalForResource
). Даже там.. сделал ответ сервера быстрее решил проблему
Ответ 29
В моем случае это было связано с тем, что я подключался к HTTP, и он работал по протоколу HTTPS.
Ответ 30
Это может быть проблемой параметра, который вы передаете в тело запроса. Я также столкнулся с той же проблемой. Но потом я наткнулся на ответ CMash здесь fooobar.com/info/127920/…, и я изменил свой параметр, и он работает.
Проблема в параметре, который я передавал, касается String Encoding
.
Надеюсь это поможет.
I have this issue also, running on an iOS 8 device.
It is detailed some more here and seems to be a case of iOS trying to use connections that have already timed out.
My issue isn’t the same as the Keep-Alive problem explained in that link, however it seems to be the same end result.
I have corrected my problem by running a recursive block whenever I receive an error -1005 and this makes the connection eventually get through even though sometimes the recursion can loop for 100+ times before the connection works, however it only adds a mere second onto run times and I bet that is just the time it takes the debugger to print the NSLog’s for me.
Here’s how I run a recursive block with AFNetworking:
Add this code to your connection class file
// From Mike Ash's recursive block fixed-point-combinator strategy https://gist.github.com/1254684
dispatch_block_t recursiveBlockVehicle(void (^block)(dispatch_block_t recurse))
{
// assuming ARC, so no explicit copy
return ^{ block(recursiveBlockVehicle(block)); };
}
typedef void (^OneParameterBlock)(id parameter);
OneParameterBlock recursiveOneParameterBlockVehicle(void (^block)(OneParameterBlock recurse, id parameter))
{
return ^(id parameter){ block(recursiveOneParameterBlockVehicle(block), parameter); };
}
Then use it likes this:
+ (void)runOperationWithURLPath:(NSString *)urlPath
andStringDataToSend:(NSString *)stringData
withTimeOut:(NSString *)timeOut
completionBlockWithSuccess:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure
{
OneParameterBlock run = recursiveOneParameterBlockVehicle(^(OneParameterBlock recurse, id parameter) {
// Put the request operation here that you want to keep trying
NSNumber *offset = parameter;
NSLog(@"--------------- Attempt number: %@ ---------------", offset);
MyAFHTTPRequestOperation *operation =
[[MyAFHTTPRequestOperation alloc] initWithURLPath:urlPath
andStringDataToSend:stringData
withTimeOut:timeOut];
[operation setCompletionBlockWithSuccess:
^(AFHTTPRequestOperation *operation, id responseObject) {
success(operation, responseObject);
}
failure:^(AFHTTPRequestOperation *operation2, NSError *error) {
if (error.code == -1005) {
if (offset.intValue >= numberOfRetryAttempts) {
// Tried too many times, so fail
NSLog(@"Error during connection: %@",error.description);
failure(operation2, error);
} else {
// Failed because of an iOS bug using timed out connections, so try again
recurse(@(offset.intValue+1));
}
} else {
NSLog(@"Error during connection: %@",error.description);
failure(operation2, error);
}
}];
[[NSOperationQueue mainQueue] addOperation:operation];
});
run(@0);
}
You’ll see that I use a AFHTTPRequestOperation
subclass but add your own request code. The important part is calling recurse(@offset.intValue+1));
to make the block be called again.
When i’m calling service, it will give below error response.
I did google and restarted Xcode and simulator. its not working for me. even in device also i’m facing same issue. can any one help me.
Service calling:
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@?%@", urlString,paramsString]];
theRequest = [[NSMutableURLRequest alloc] initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:120.0];
if (paramsString!=nil)
{
NSString *msgLength = [[NSString alloc]initWithFormat:@"%lu",(unsigned long)[paramsString length]];
[theRequest addValue:msgLength forHTTPHeaderField:@"Content-Length"];
}
[theRequest setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[theRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[theRequest setValue:[NSString stringWithFormat:@"authToken=%@",self.authToken] forHTTPHeaderField:@"Cookie"];
theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if (theConnection)
{
self.receivedData=[[NSMutableData alloc] init];
}
Error:
Error Domain=NSURLErrorDomain Code=-1005 "The network connection was lost." UserInfo=0x7c3770a0 {NSErrorFailingURLStringKey=serviceUrl, _kCFStreamErrorCodeKey=-4, NSErrorFailingURLKey=serviceUrl, NSLocalizedDescription=The network connection was lost., _kCFStreamErrorDomainKey=4, NSUnderlyingError=0x79769170 "The network connection was lost."}
This error was most annoying… I would suggest retrying manually,
// MARK: - POST Request
class func requestPOSTURL(_ endpoint : String, params : [String : AnyObject]?, headers : [String : String]?, success:@escaping (JSON) -> Void, failure:@escaping (Error) -> Void, noConnection:@escaping (String) -> Void){
if Reachability.isConnectedToNetwork(){
let url = baseUrl + endpoint
Alamofire.request(url, method: .post, parameters: params, encoding: JSONEncoding.default, headers: headers).responseJSON { (responseObject) -> Void in
let paramsJson = JSON(params as Any)
print("\nREQUEST-> URL :-\(url)\n Parameters :-\(paramsJson) ")
if responseObject.result.isSuccess {
//resetting retryCounter
retryCounter = 0
let resJson = JSON(responseObject.result.value!)
success(resJson)
print("Res Json : \(resJson)")
}
if responseObject.result.isFailure {
let error : Error = responseObject.result.error!
if error._code == -1005{
if(retryCounter < 2) {
print("Failure lost connection retrying.. count:\(retryCounter)")
retryCounter += 1
//recreating post request and sending again
requestPOSTURL(endpoint, params: params, headers: headers, success: success, failure: failure, noConnection: noConnection)
return
}
else {
failure(error)
return
}
}else {
failure(error)
return
}
}
}
}else{
noConnection("error")
}
}