Ошибка домена = NSURLErrorDomain Code = -1005 "Сетевое соединение было потеряно".

У меня есть приложение, которое отлично работает на 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 на прикрепленном изображении:

NSURLConnection client delegate did fail error.

Изменение использования 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, это решило мою проблему.

enter image description here

Надеюсь, это поможет кому-то.

Ответ 28

Я столкнулся с той же проблемой, когда звонил, используя сервер своей компании из приложения iOS 12 с физического устройства. Проблема заключалась в том, что жесткий диск сервера был заполнен. Освобождение места на сервере решило проблему.

Я обнаружил ту же ошибку в другой ситуации, которую я считаю из-за тайм-аута, который нельзя параметризировать через стандартный сетевой API, предоставляемый Apple (URLSession.timeoutIntervalForRequest и URLSession.timeoutIntervalForResource). Даже там.. сделал ответ сервера быстрее решил проблему

Ответ 29

В моем случае это было связано с тем, что я подключался к HTTP, и он работал по протоколу HTTPS.

Ответ 30

Это может быть проблемой параметра, который вы передаете в тело запроса. Я также столкнулся с той же проблемой. Но потом я наткнулся на ответ CMash здесь fooobar.com/info/127920/..., и я изменил свой параметр, и он работает.

Проблема в параметре, который я передавал, касается String Encoding.

Надеюсь это поможет.