Запрос GUR NSURLConnection возвращает -1005, "сетевое соединение потеряно"

Я пытаюсь сделать простой запрос GET, используя NSURLConnection в XCode 6 (Beta7 2) в iOS 8 SDK, который завершается с ошибкой "Код 1005, сетевое соединение было потеряно". Вызов не удается, когда я пытаюсь получить http://www.google.com/ или несколько других примеров страниц из Интернета, но происходит успешно, если я делаю запрос к простому HTTP-серверу на localhost (python -m SimpleHTTPServer). Я также пытался использовать AFNetworking библиотека (2.4.1) - URL-адреса, которые не работают с NSURLConnection, также не работают с библиотекой.

Вот мой код -

NSString * url = @"http://0.0.0.0:8000";
// NSString * url = @"http://www.google.com";

NSLog(@"URL : %@", url);

// Mutable is probably not required, but just in case it REALLY WANTS me to set HTTP method
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
[theRequest setHTTPMethod:@"GET"];

NSURLResponse *urlResponse = nil;
NSError *error = nil;

NSData * data = [NSURLConnection sendSynchronousRequest:theRequest
                                      returningResponse:&urlResponse
                                error:&error];

if (error == nil) {
    NSString *response = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
    NSLog(response);
} else {
    NSString *response = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
    NSLog(@"%@", [error userInfo]);
}

Журналы:

2014-09-11 17:34:23.950 SearchExample[5092:2074687] URL : http://www.google.com
2014-09-11 17:34:24.023 SearchExample[5092:2074687] {
    NSErrorFailingURLKey = "http://www.google.com";
    NSErrorFailingURLStringKey = "http://www.google.com";
    NSLocalizedDescription = "The network connection was lost.";
    NSUnderlyingError = "Error Domain=kCFErrorDomainCFNetwork Code=-1005 \"The network connection was lost.\" UserInfo=0x7fc8515640a0 {NSErrorFailingURLStringKey=http://www.google.com/, NSErrorFailingURLKey=http://www.google.com/, _kCFStreamErrorCodeKey=57, _kCFStreamErrorDomainKey=1, NSLocalizedDescription=The network connection was lost.}";
    "_kCFStreamErrorCodeKey" = 57;
    "_kCFStreamErrorDomainKey" = 1;
}
2014-09-11 17:34:24.023 SearchExample[5092:2074687] URLResponse: (null)

7 ответов

Решение

Я недавно видел сбой подключения к Интернету на симуляторе iPhone 6, что привело к тем же ошибкам. У моего Mac было рабочее интернет-соединение, а на симуляторе - нет. Перезапуск симулятора исправил проблему.

Я получал эту ошибку последовательно на iOS 9 при определенных сетевых вызовах. Два работали нормально, а два других - нет.

Оказалось, что это вызвано некоторыми неверными параметрами, которые я передавал с телом запроса... Я не ожидал, что это вызовет ошибку -1005... но это произошло.. Избавление от ненужных параметров сделало все Работа!

Я попробовал все предложенное, по крайней мере, в 15 ответах от Google, но ни один из них не решил мою проблему, пока я не попробовал следующее, которое полностью решило мою проблему. Похоже, что соединения Wi-Fi могут быть повреждены на Mac, поэтому, если вы удалите конкретное соединение, которое вы используете, а затем снова подключитесь (выбрав сеть и снова введя свой пароль), то это решит проблему, и больше не будет страшно -1005 Ошибки "потеря сетевого подключения".

  • Перейдите к символу Wi-Fi в строке меню вашего Mac и "Отключите Wi-Fi"
  • Затем выберите "Открыть настройки сети" (из того же меню внизу).
  • В правом нижнем углу панели "Сеть" выберите "Дополнительно".
  • Выберите сетевое подключение, к которому вы ранее были подключены.
  • Нажмите символ минус прямо под этой таблицей, чтобы удалить это соединение.
  • Нажмите "ОК" для этого окна.
  • Нажмите "Применить" в окне "Сеть".
  • Вернитесь к символу Wi-Fi на панели меню и снова включите Wi-Fi.
  • Подождите, пока появится ваше сетевое соединение, а затем выберите его (и теперь оно снова запросит пароль, потому что вы удалили информацию о соединении).
  • Теперь он запомнит это обновленное соединение, которое должно решить проблему!

Попробуйте изменить сериализацию запроса в AFNetworking http или json. в моем случае это был json, тогда я установил http. Теперь это работает.

[[VTNetworkingHelper sharedInstance] performRequestWithPath:@"Your url  " withAuth:YES forMethod:@"POST" withRequestJSONSerialized:NO withParams:params withCompletionHandler:^(VTNetworkResponse *response) {
            if (response.isSuccessful) {
    }else {
    }];

Я заметил, что эта проблема возникает, когда вы продолжаете активировать симулятор, и ваш Mac долго спит (скажем, от 5 до 10 часов). Тогда вдруг вы запускаете приложение на симуляторе, он отображает журнал как

NSURLConnection GET request returns Code=-1005 "The network connection was lost."

Решение состоит в том, чтобы просто выйти из симулятора, очистить проект и повторно запустить проект. Это сработало для меня!

У меня была похожая проблема, и перезапуск симулятора не работал. В моем случае я был в состоянии поразить веб-сервис альтернативно, как в нечетное время, это было бы успешно, и в четное время это бросило меня с этой ошибкой. Я знаю, это странно, но это было так или иначе. Решил это со следующим подходом в swift:

 let urlconfig = NSURLSessionConfiguration.defaultSessionConfiguration()
                urlconfig.timeoutIntervalForRequest = 1
                urlconfig.timeoutIntervalForResource = 1
                let session = NSURLSession(configuration: urlconfig)

                let task = session.dataTaskWithRequest(request){(data,response,error) in
    //Processing
    }
 task.resume()

Простое и примерное решение, проверенное много раз, работает отлично.

// Проверяем ошибку ответа, используя код состояния, и если вы получите -1005, то снова вызовите этот API.

                if let strErrorReasonCode : Int = response.response?.statusCode {
                           if authentication_Errors_Range.contains(Alamofire_Error) {
                                self.POST(urlString, paramaters: paramaters, showLoader: showLoader, success: { (responseObject) in
                                    if response.result.isSuccess {
                                        if let value = response.result.value {
                                            let dictResponce = self.isValidated(value as AnyObject)
                                            if dictResponce.0 == true {
                                                success(dictResponce.1)
                                            }
                                            else {
                                                failure(dictResponce.1)
                                            }
                                        }
                                    }
                                }, failure: {_ in
                                    failure(jsonResponce)
                                })
                            }
                 }
Другие вопросы по тегам