Ответ 1
Перезапуск симулятора исправил проблему для меня.
У меня есть приложение, которое отлично работает на 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
, но все равно получаю ту же ошибку.
Перезапуск симулятора исправил проблему для меня.
У нас была именно эта ошибка, и она оказалась проблемой с базовой реализацией HTTP NSURLRequest
:
Насколько мы можем судить, когда iOS 8/9/10/11 получает HTTP-ответ с заголовком Keep-Alive
, она сохраняет это соединение для повторного использования позже (как и должно быть), но сохраняет его больше, чем Параметр timeout
заголовка Keep-Alive (кажется, он всегда поддерживает соединение в течение 30 секунд.) Затем, когда приложение отправляет второй запрос менее чем через 30 секунд, оно пытается повторно использовать соединение, которое могло быть сбрасывается сервером (если прошло больше, чем реальный Keep-Alive
).
Вот решения, которые мы нашли до сих пор:
KeepAliveTimeout
.BrowserMatch "iOS 8\." nokeepalive
в файле мода setenvif.conf
)Connection: close
: это скажет серверу немедленно прекратить соединение и ответить без заголовков поддержки активности. НО в настоящий момент NSURLSession, кажется, переопределяет заголовок Connection
при отправке запросов (мы не тестировали это решение всесторонне, так как мы можем настроить конфигурацию Apache)Для моего, Resetting content and settings
симулятора работает.
В reset симулятор выполнит следующие шаги:
iOS Simulator → reset Содержание и настройки → Нажмите reset (на предупреждение, которое придет)
Время выполнения симулятора iOS 8.0 имеет ошибку, согласно которой, если ваша сетевая конфигурация изменяется при загрузке имитируемого устройства, API-интерфейсы более высокого уровня (например, CFNetwork) в моделируемой среде выполнения будут считать, что он потерял сетевое подключение. В настоящее время рекомендуемым решением является просто перезагрузка имитируемого устройства при изменении конфигурации сети.
Если вы столкнулись с этой проблемой, добавьте дополнительные дублированные радары в http://bugreport.apple.com, чтобы получить повышенный приоритет.
Если вы видите эту проблему, не изменив конфигурации сети, то это не известная ошибка, и вы обязательно должны указать радар, указав, что проблема не является известной ошибкой, измененной конфигурацией сети.
Также есть проблема с бета 5 и AFNetworking 1.3 при работе на симуляторе iOS 8, которая приводит к ошибке соединения:
Domain = NSURLErrorDomain Code = -1005 "Сетевое соединение потеряно."
Тот же самый код прекрасно работает на симуляторах iOS 7 и 7.1, и мой прокси-сервер отладки показывает, что сбой происходит до того, как на самом деле попытка подключения (т.е. Запросы не регистрируются).
Я отследил сбой NSURLConnection и сообщил об ошибке в Apple. Смотрите строку 5 на прикрепленном изображении:
.
Изменение использования https
позволяет подключаться к симуляторам iOS 8, хотя и с периодическими ошибками.
Проблема все еще присутствует в Xcode 6.01 (gm).
для меня проблема заключалась в том, чтобы перезапустить симулятор и reset содержимое и настройки.
Открытие Чарльза решило проблему для меня, что кажется очень странным...
Charles - это прокси-сервер HTTP/HTTP-монитор/обратный прокси-сервер, который позволяет разработчику просматривать весь трафик HTTP и SSL/HTTPS между их компьютером и Интернетом. Это включает в себя запросы, ответы и заголовки HTTP (которые содержат файлы cookie и информацию о кэшировании).
Я столкнулся с этой проблемой при использовании Alamofire. Моя ошибка заключалась в том, что я отправлял пустой словарь [:]
для параметров по запросу GET
, а не по отправке параметров nil
.
Надеюсь, это поможет!
См. комментарий 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;
}
}
Я тоже получал эту ошибку, но на реальных устройствах, а не на симуляторе. Мы заметили ошибку при доступе к нашему серверу heroku на HTTPS (сервер gunicorn) и сделали POSTS с большими bodys (что-то более 64Kb). Мы используем HTTP Basic Auth для аутентификации и заметили, что ошибка была решена НЕ используя метод делегата didReceiveChallenge:
на NSURLSession, а скорее выпекаем в аутентификации в исходный заголовок запроса, добавив Authentiation: Basic <Base64Encoded UserName:Password>
. Это предотвращает необходимость 401 для запуска сообщения делегата didReceiveChallenge:
, а последующее сетевое соединение потеряно.
У меня была такая же проблема. Решение было простым, я установил HTTPBody
, но не установил HTTPMethod
в POST
. После исправления все было в порядке.
У меня такая же проблема. Я не знаю, как 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;
,
Мне пришлось выйти из XCode, удалить содержимое папки DerivedData (~/Library/Developer/Xcode/DerivedData или /Library/Developer/Xcode/DerivedData ) и выйти из симулятора, чтобы сделать эту работу.
У меня тоже есть эта проблема, работающая на устройстве 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));
для повторного вызова блока.
Я получал ошибку на устройстве iOS 7, когда я использовал бета-версию Xcode 6.2.
Переход с бета-версии Xcode 6.2 на 6.1.1 исправил проблему, по крайней мере, на устройстве iOS 7.
Если проблема возникает на устройстве, проверьте, проходит ли трафик через прокси (Настройки > Wi-Fi > (информация) > HTTP-прокси). У меня была настройка устройства для использования с Чарльзом, но я забыл про прокси. Кажется, что без того, чтобы Чарльз действительно выполнял эту ошибку.
Если кто-то получает эту ошибку при загрузке файлов на серверный сервер, убедитесь, что на принимающем сервере установлен максимальный размер содержимого, допустимый для вашего носителя. В моем случае для NGINX требуется более высокий client_max_body_size
. NGINX отклонил запрос до того, как будет выполнена загрузка, поэтому код ошибки не вернулся.
На 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
Получил проблему в течение нескольких месяцев и, наконец, обнаружил, что когда мы отключили DNSSEC в нашем домене api, все было в порядке:
Я подключался через VPN. Отключение VPN решило проблему.
Я ударил эту ошибку при передаче NSURLRequest в NSURLSession без установки запроса HTTPMethod.
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:urlComponents.URL];
Ошибка домена = NSURLErrorDomain Code = -1005 "Сетевое соединение было потеряно".
Добавьте HTTPMethod
, хотя соединение прекрасно работает
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:urlComponents.URL];
[request setHTTPMethod:@"PUT"];
Проверьте, можете ли вы запросить другие приложения (например, сафари). Если это не может быть что-то на вашем компьютере. В моем случае у меня была эта проблема с Avast Antivirus, которая блокировала мой запрос симуляторов (не спрашивайте меня почему).
Перезапуск компьютера исправил проблему для меня с помощью Xcode9.1. Я перезапустил симулятор и Xcode, он не работает.
У меня была эта проблема по следующей причине.
TL;DR: Проверьте, отправляется ли запрос GET
, который должен отправлять параметры на URL, а не в свойстве NSURLRequest HTTBody
.
=============================================== ===
Я установил сетевую абстракцию в своем приложении, и он работал очень хорошо для всех моих запросов.
Я добавил новый запрос на другой веб-сервис (не мой), и он начал бросать мне эту ошибку.
Я пошел на детскую площадку и начал с нуля строить строгий запрос, и это сработало. Поэтому я начал приближаться к своей абстракции, пока не нашел причину.
У моей реализации абстракции была ошибка:
Я отправил запрос, который должен был отправить параметры, закодированные в URL-адресе, и я также заполнил свойство NSURLRequest HTTBody
параметрами запроса.
Как только я удалил HTTPBody
, он сработал.
Я получал эту ошибку и также замечаю, что приложение Postman также падало, но работало в приложении Advanced Rest Client (ARC) и работало в Android. Поэтому мне пришлось установить Charles для отладки сообщения, и я замечаю, что код ответа был -1. Проблема заключалась в том, что программист REST забыл вернуть код ответа 200.
Я надеюсь, что это поможет другим разработчикам.
Всякий раз, когда появляется ошибка -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...
}
}];
Вам нужно добавить свой код, чтобы снова вызвать функцию. Убедитесь, что вы вызывали метод один раз, иначе вызовите рекурсивный цикл.
Я столкнулся с той же проблемой, я включил Network Link Conditioner для медленного тестирования сети для приложения. Это создавало эту ошибку несколько раз. Когда я отключил ее в Settings > Developer > Network Link Conditioner
, это решило мою проблему.
Надеюсь, это поможет кому-то.
Я столкнулся с той же проблемой, когда звонил, используя сервер своей компании из приложения iOS 12 с физического устройства. Проблема заключалась в том, что жесткий диск сервера был заполнен. Освобождение места на сервере решило проблему.
Я обнаружил ту же ошибку в другой ситуации, которую я считаю из-за тайм-аута, который нельзя параметризировать через стандартный сетевой API, предоставляемый Apple (URLSession.timeoutIntervalForRequest
и URLSession.timeoutIntervalForResource
). Даже там.. сделал ответ сервера быстрее решил проблему
В моем случае это было связано с тем, что я подключался к HTTP, и он работал по протоколу HTTPS.
Это может быть проблемой параметра, который вы передаете в тело запроса. Я также столкнулся с той же проблемой. Но потом я наткнулся на ответ CMash здесь fooobar.com/info/127920/..., и я изменил свой параметр, и он работает.
Проблема в параметре, который я передавал, касается String Encoding
.
Надеюсь это поможет.