Programing

Error Domain = NSURLErrorDomain Code = -1005“네트워크 연결이 끊어졌습니다.”

lottogame 2020. 4. 2. 08:10
반응형

Error Domain = NSURLErrorDomain Code = -1005“네트워크 연결이 끊어졌습니다.”


iOS7과 iOS8 모두 Xcode6-Beta1 및 Xcode6-Beta2에서 잘 작동하는 응용 프로그램이 있습니다. 그러나 Xcode6-Beta3, Beta4, Beta5에서는 iOS8의 네트워크 문제에 직면하고 있지만 iOS7에서는 모든 것이 잘 작동합니다. 오류가 발생 "The network connection was lost."합니다. 오류는 다음과 같습니다.

오류 : 오류 Domain = NSURLErrorDomain 코드 = -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이 Keep-Alive헤더 와 함께 HTTP 응답을 수신하면 나중에 다시 사용해야하기 위해이 연결을 유지하지만 timeout매개 변수 이상의 매개 변수를 유지합니다. Keep-Alive 헤더 (항상 30 초 동안 연결을 유지하는 것 같습니다.) 그런 다음 30 초 이내에 앱에서 두 번째 요청을 보내면 서버에서 삭제되었을 수있는 연결을 다시 사용하려고 시도합니다. (실제보다 더 많이 Keep-Alive경과 한 경우).

지금까지 찾은 솔루션은 다음과 같습니다.

  • 서버의 시간 종료 매개 변수를 30 초 이상 늘리십시오. Keep-Alive 헤더에 제공된 값에 관계없이 서버가 30 초 동안 연결을 유지하는 것처럼 iOS가 항상 작동하는 것처럼 보입니다. (이 KeepAliveTimeout옵션 옵션 을 설정하여 Apache에서 수행 할 수 있습니다 .
  • (아파치에 대한 예를 들어, 당신은 단순히 앱 사용자 에이전트를 기반으로 아이폰 OS 클라이언트에 대한 연결 유지 메커니즘을 해제 할 수 있습니다 BrowserMatch "iOS 8\." nokeepalive유행의 파일을 setenvif.conf)
  • 서버에 액세스 할 수없는 경우 Connection: close헤더를 사용 하여 요청을 보낼 수 있습니다 . 그러면 서버가 연결을 즉시 끊고 활성 헤더를 유지하지 않고 응답하도록 지시합니다. 그러나 현재 NSURLSession은 Connection요청을 보낼 때 헤더 를 재정의하는 것으로 보입니다 (아파치 구성을 조정할 수 있으므로이 솔루션을 광범위하게 테스트하지는 않았습니다)

내 경우 Resetting content and settings에는 시뮬레이터가 작동합니다. 시뮬레이터를 재설정하려면 다음 단계를 수행하십시오.

iOS 시뮬레이터-> 내용 및 설정 재설정-> 재설정을 누릅니다 (나올 경고에)


iOS 8.0 시뮬레이터 런타임에는 시뮬레이션 된 장치가 부팅되는 동안 네트워크 구성이 변경되면 시뮬레이션 된 런타임의 상위 수준 API (예 : CFNetwork)가 네트워크 연결이 끊어진 것으로 생각합니다. 현재 권장되는 해결 방법은 네트워크 구성이 변경 될 때 시뮬레이션 된 장치를 재부팅하는 것입니다.

이 문제의 영향을받는 경우 http://bugreport.apple.com추가 중복 레이더를 제출 하여 우선 순위를 높이십시오.

네트워크 구성을 변경 하지 않고이 문제가 발생 하면 알려진 버그가 아니며, 알려진 네트워크 구성 변경 버그가 아님을 나타내는 레이더를 제출해야합니다.


나를 위해 문제를 해결 한 것은 시뮬레이터를 다시 시작하고 내용과 설정을 재설정하는 것이 었습니다.


iOS 8 시뮬레이터에서 실행할 때 베타 5 및 AFNetworking 1.3에 문제가있어 연결 오류가 발생합니다.

Domain = NSURLErrorDomain Code = -1005 "네트워크 연결이 끊어졌습니다."

동일한 코드가 iOS 7 및 7.1 시뮬레이터에서 제대로 작동하며 디버깅 프록시는 실제로 연결을 시도하기 전에 실패가 발생 함을 보여줍니다 (즉, 요청이 기록되지 않음).

NSURLConnection의 실패를 추적하고 Apple에 버그를보고했습니다. 첨부 된 이미지의 5 행을 참조하십시오.

NSURLConnection 클라이언트 대리자 오류가 발생했습니다.

사용을 변경하면 https간헐적 인 오류가 있지만 iOS 8 시뮬레이터에서 연결할 수 있습니다.

Xcode 6.01 (gm)에 여전히 문제가 있습니다.


Charles를 열면 문제가 해결되어 매우 이상해 보입니다 ...

Charles는 개발자가 자신의 컴퓨터와 인터넷 사이의 모든 HTTP 및 SSL / HTTPS 트래픽을 볼 수 있도록하는 HTTP 프록시 / HTTP 모니터 / 역 프록시입니다. 여기에는 요청, 응답 및 HTTP 헤더 (쿠키 및 캐싱 정보가 포함됨)가 포함됩니다.


Alamofire를 사용하는 동안이 문제가 발생했습니다. 내 실수는 [:]매개 변수를 GET보내는 것이 아니라 요청시 매개 변수에 대한 빈 사전 보내는 것 nil입니다.

도움이 되었기를 바랍니다!


Github의 1 월 5 일에 대한 pjebs 의견을 참조하십시오.

방법 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 요청을 두 번 실행

솔루션 : 방법을 사용하여 사이트에 연결하고, (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;
     }

}

이 오류도 발생했지만 시뮬레이터가 아닌 실제 장치에서 발생했습니다. HTTPS (gunicorn 서버)에서 heroku 백엔드에 액세스하고 큰 본문 (64Kb 이상)으로 POSTS를 수행 할 때 오류가 발생했습니다. 인증에 HTTP 기본 인증을 사용했으며 didReceiveChallenge:NSURLSession 에서 delegate 메소드를 사용하지 않고을 추가하여 Authentication을 원래 요청 헤더에 베이킹 하여 오류가 해결 되었음을 알았습니다 Authentiation: Basic <Base64Encoded UserName:Password>. 이렇게하면 didReceiveChallenge:위임 메시지 를 트리거하는 데 필요한 401 및 후속 네트워크 연결이 끊어지지 않습니다.


나는 같은 문제가 있었다. 솔루션은 내가 설정 한, 간단 HTTPBody하지만 설정하지 않은 HTTPMethodPOST. 이 문제를 해결 한 후 모든 것이 정상이었습니다.


나는 같은 문제가 있었다. AFNetworking이 https 요청을 구현하는 방법을 모르겠지만 NSURLSession의 캐시 문제입니다.

응용 프로그램이 Safari에서 다시 추적 한 다음 http 요청을 게시하면 "http load failed 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 + 번 반복 될 수 있지만 결국 연결이 이루어 지지만 실행에 단 2 초만 추가됩니다. 시간과 나는 그것이 디버거가 NSLog를 인쇄하는 데 걸리는 시간 일뿐입니다.

AFNetworking으로 재귀 블록을 실행하는 방법은 다음과 같습니다.이 코드를 연결 클래스 파일에 추가하십시오.

// 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); };
}

그런 다음 이것을 좋아하십시오 :

+ (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));블록을 다시 호출 하도록 호출 하는 것입니다.


기기에서 문제가 발생하면 트래픽이 프록시를 통과하는지 확인하십시오 (설정> Wi-Fi> (정보)> HTTP 프록시). Charles와 함께 사용할 장치 설정이 있었지만 프록시는 잊었습니다. Charles가 실제로 실행하지 않으면이 오류가 발생하는 것 같습니다.


백엔드 서버에 파일을 업로드하는 동안 누군가이 오류가 발생하면 수신 서버의 미디어에 허용되는 최대 컨텐츠 크기를 확인하십시오. 제 경우에는 NGINX가 더 높았습니다 client_max_body_size. NGINX는 업로드가 완료되기 전에 요청을 거부하므로 오류 코드가 다시 나타나지 않습니다.


Xcode 6.2 베타를 사용할 때 iOS 7 장치에서 오류가 발생했습니다.

Xcode 6.2 베타에서 6.1.1로 다시 전환하면 적어도 iOS 7 기기에서 문제가 해결되었습니다.


2017-01-25애플이 오류에 대한 기술 Q & A를 발표했다 :

애플 기술 Q & A QA1941

"네트워크 연결이 끊어졌습니다"오류 처리

A : NSURLErrorNetworkConnectionLost는 NSURLErrorDomain 오류 도메인에서 오류 -1005이며 사용자에게“네트워크 연결이 끊어졌습니다”로 표시됩니다. 이 오류는 HTTP 요청이 진행되는 동안 HTTP 요청을 전달하는 기본 TCP 연결이 끊어 졌음을 의미합니다 (자세한 내용은 아래 참조). 경우에 따라 NSURLSession은 이러한 요청을 자동으로 (특히 요청이 dem 등원 인 경우) 재 시도 할 수 있지만 다른 상황에서는 HTTP 표준에서 허용하지 않는 경우가 있습니다.

https://developer.apple.com/library/archive/qa/qa1941/_index.html#//apple_ref/doc/uid/DTS40017602


몇 달 동안 문제가 발생하여 마침내 api 도메인에서 DNSSEC를 비활성화하면 모든 것이 정상이라는 것을 발견했습니다.


VPN을 통해 연결하고있었습니다. VPN을 비활성화하면 문제가 해결되었습니다.


요청의 HTTPMethod를 설정하지 않고 NSURLRequest를 NSURLSession에 전달할 때이 오류가 발생 했습니다 .

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:urlComponents.URL];

오류 도메인 = NSURLErrorDomain 코드 = -1005 "네트워크 연결이 끊어졌습니다."

을 추가하면 HTTPMethod연결이 제대로 작동합니다.

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:urlComponents.URL];
[request setHTTPMethod:@"PUT"];

사파리와 같은 다른 앱에서 요청할 수 있는지 테스트하십시오. 컴퓨터에없는 것일 수 있습니다. 필자의 경우 시뮬레이터 요청을 차단하는 Avast Antivirus 에서이 문제가 발생했습니다 (이유를 묻지 마십시오).


컴퓨터를 다시 시작하면 Xcode9.1의 문제가 해결되었습니다. 시뮬레이터와 Xcode를 다시 시작했는데 작동하지 않습니다.


다음과 같은 이유로이 문제가 발생했습니다.

TLDR : 속성 GET대신 URL에서 매개 변수를 보내야하는 요청을 보내는 지 확인하십시오 NSURLRequest's HTTBody.

=====================================================

내 앱에 네트워크 추상화를 마운트했으며 모든 요청에 ​​대해 잘 작동했습니다.

다른 웹 서비스 (내 자신이 아닌)에 새로운 요청을 추가 했는데이 오류가 발생하기 시작했습니다.

나는 운동장에 갔고 맨손으로 요청을 시작했습니다. 그래서 원인을 찾을 때까지 추상화에 더 가까이 다가 가기 시작했습니다.

내 추상화 구현에는 버그가 있습니다 .URL로 인코딩 된 매개 변수를 보내야하는 요청을 보내고 있었고 NSURLRequest's HTTBody속성을 쿼리 매개 변수로 채우고 있었습니다. 내가 제거하자마자 HTTPBody효과가있었습니다.


이 오류가 발생했으며 Postman 응용 프로그램도 떨어지고 있지만 앱 ARC (Advanced Rest Client)에서 작업하고 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... 
       }
  }];

함수를 다시 호출하려면 코드를 추가해야합니다. 한 번만 호출 메소드 였는지 확인하십시오. 그렇지 않으면 호출 재귀 루프입니다.


나는 같은 문제에 직면하여 앱의 느린 네트워크 테스트를 위해 네트워크 링크 컨디셔너를 활성화했습니다. 이 오류가 몇 번 발생했습니다.에서를 사용 중지하면 Settings > Developer > Network Link Conditioner문제가 해결되었습니다.

여기에 이미지 설명을 입력하십시오

이것이 누군가를 돕기를 바랍니다.


iOS 12 앱에서 회사 서버를 사용하여 물리적 장치로 전화를 걸 때도 같은 문제가 발생했습니다. 문제는 서버 하드 디스크가 가득 찼다는 것입니다. 서버의 공간을 비우면 문제가 해결되었습니다.

Apple ( URLSession.timeoutIntervalForRequestURLSession.timeoutIntervalForResource)에서 제공하는 표준 네트워킹 API를 통해 매개 변수화 할 수없는 시간 초과로 인해 다른 상황에서 동일한 오류가 발견되었습니다 . 서버 응답을 더 빠르게하여 문제를 해결했습니다.


제 경우에는 HTTP에 연결하고 HTTPS에서 실행 중이었기 때문입니다.


요청 본문에 전달하는 매개 변수의 문제 일 수 있습니다. 나는 또한 같은 문제에 직면했다. 그러나 https://stackoverflow.com/a/34181221/5867445 에서 CMash의 답변을 발견했으며 매개 변수를 변경하면 작동합니다.

내가 통과 한 매개 변수의 문제는 약 String Encoding입니다.

도움이 되었기를 바랍니다.

참고 URL : https://stackoverflow.com/questions/25372318/error-domain-nsurlerrordomain-code-1005-the-network-connection-was-lost

반응형