Error Domain = NSURLErrorDomain Code = -1005 „Połączenie sieciowe zostało utracone.”

268

Mam aplikację, która działa dobrze na Xcode6-Beta1 i Xcode6-Beta2 z iOS7 i iOS8. Ale z Xcode6-Beta3, Beta4, Beta5 mam problemy z siecią z iOS8, ale wszystko działa dobrze na iOS7. Dostaję błąd "The network connection was lost.". Błąd jest następujący:

Błąd: Błąd Domena = NSURLErrorDomain Code = -1005 „Połączenie sieciowe zostało utracone.” UserInfo = 0x7ba8e5b0 {NSErrorFailingURLStringKey =, _kCFStreamErrorCodeKey = 57, NSErrorFailingURLKey =, NSLocalizedDescription = Połączenie sieciowe zostało utracone., _KCFStreamErrorDomainKey = 1, NS7 Błąd 7 = Błąd 0x0

Używam AFNetworking 2.x i następującego fragmentu kodu, aby wykonać połączenie sieciowe:

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

Próbowałem, NSURLSessionale nadal pojawia się ten sam błąd.

VoidStack
źródło
Jakakolwiek aktualizacja ? Zdarza mi się to tylko w iOS 8 na Wi-Fi, wciąż próbując znaleźć obejście.
Dimillian
Czy ktoś może mi pomóc rozwiązać mój problem, prawie ten sam problem, ale inny kod błędu, stackoverflow.com/questions/26972822/…
iYoung
1
ten sam problem z iOS 10.0.1 i Xcode 8.
Satheeshwaran 17.10.16
1
Dostałem ten błąd dziś rano i naprawiłem go teraz prostym i dziwnym rozwiązaniem. Żądany adres serwera jest niepoprawny, nie zwrócono kodu statusu 4xx ani 5xx, właśnie napotkał ten problem, nie jestem pewien, co dokładnie jest przyczyną źródłową. Potwierdź więc z programistami zaplecza w swoim zespole, inaczej zmarnujesz na to kilka godzin.
Itachi,

Odpowiedzi:

414

Ponowne uruchomienie symulatora rozwiązało problem.

Collin
źródło
3
Co się stanie, jeśli ten problem dotyczy urządzenia, a nie karty SIM? Próbowałem ponownie uruchomić urządzenie, wciąż ten sam błąd.
Sean Clark,
2
@SeanClark: zobacz następną odpowiedź: ponowne uruchomienie symulatora działa, ponieważ system operacyjny musi zerwać martwe połączenie zamiast próbować ponownie ich używać po ich zerwaniu przez serwer. Aby obejść ten problem, możesz wyłączyć mechanizm utrzymywania aktywności na serwerze dla klientów iOS lub, jeśli nie masz dostępu do serwera, możesz po prostu spróbować ponownie tego samego żądania w przypadku niepowodzenia (błąd powinien spowodować system operacyjny przerywa połączenie, a nowe jest tworzone po wysłaniu ponownej próby).
Arthur
Obecnie używam Xcode 6.2 i to, co rozwiązało, to kliknięcie na iOS Simulator> Resetuj ustawienia i zawartość. Po zakończeniu opuściłem symulator, przebudowałem i uruchomiłem mój projekt ... potem wszystko działało idealnie.
KingPolygon
Zresetowanie symulatora zadziałało, ale tylko w 10% przypadków. Właśnie dostałem nowego ISP i to działa trochę dziwnie. Dzieje się tak przez cały czas na symulatorze. Może to być sieć.
noobsmcgoobs
1
Resetowanie symulatora nie działało dla mnie. Jednak rozpoczęcie Charles sprawił, że problem zniknął. Zobacz stackoverflow.com/a/26066764/598057, który sugeruje użycie Charlesa. Bardzo dziwne, ale działa ...
Stanislav Pankevich
231

Wystąpił ten dokładny błąd i okazało się, że jest to problem z podstawową implementacją HTTP NSURLRequest:

O ile nam wiadomo, kiedy iOS 8/9/10/11 odbiera odpowiedź HTTP z Keep-Alivenagłówkiem, zachowuje to połączenie do ponownego użycia później (tak jak powinno), ale zachowuje je dla więcej niż timeoutparametru Keep-Alive header (wydaje się, że zawsze utrzymuje połączenie przy życiu przez 30 sekund.) Następnie, gdy aplikacja wysyła drugie żądanie mniej niż 30 sekund później, próbuje ponownie użyć połączenia, które mogło zostać zerwane przez serwer (jeśli Keep-Aliveupłynęło więcej niż rzeczywiste ).

Oto rozwiązania, które znaleźliśmy do tej pory:

  • Zwiększ parametr limitu czasu serwera powyżej 30 sekund. Wygląda na to, że iOS zawsze zachowuje się tak, jakby serwer utrzymywał połączenie otwarte przez 30 sekund, niezależnie od wartości podanej w nagłówku Keep-Alive. (Można to zrobić dla Apache, ustawiając tę KeepAliveTimeoutopcję.
  • Możesz po prostu wyłączyć mechanizm utrzymywania aktywności dla klientów iOS w oparciu o User-Agent Twojej aplikacji (np. Dla Apache: BrowserMatch "iOS 8\." nokeepalivew pliku mod setenvif.conf)
  • Jeśli nie masz dostępu do serwera, możesz spróbować wysłać swoje żądania z Connection: closenagłówkiem: to powie serwerowi, aby natychmiast porzucił połączenie i odpowiedział bez żadnych nagłówków. ALE w tej chwili NSURLSession wydaje się przesłonić Connectionnagłówek, gdy żądania są wysyłane (nie testowaliśmy tego rozwiązania dokładnie, ponieważ możemy ulepszyć konfigurację Apache)
Artur
źródło
7
Oto przykładowy projekt pokazujący problem, raport o błędzie został również przesłany do Apple. cl.ly/Xgkl/keep-alive-fail.zip Uruchom projekt, kliknij przycisk pierwszego postu (u góry ekranu), poczekaj 5 sekund, kliknij go ponownie, błąd.
Dimillian
5
Utrzymanie przy życiu jest dwustronne. Klienci dodają domyślnie nagłówek http „Connection: Keep-Alive”, dodanie parametrów utrzymania na żądanie klienta może pomóc; np. „Keep-Alive: max = 1”. Komentarz Arthura jest bardzo pomocny, ale wskazuje również na więcej niż 1 problem w sieci symulatora iOS8. Muszę użyć protokołu https, aby uzyskać połączenie, ponieważ HTTP nie powiedzie się przed wysłaniem żądania.
ptc
5
Hej, mam ten sam problem na urządzeniu. Czy można to naprawić? Jednak na iOS 7 nie ma problemu.
Andres C
9
Wskazówka: możesz użyć NSURLErrorNetworkConnectionLoststałej zamiast kodowania na stałe -1005.
Vincent Tourraine,
6
Ten problem jest nadal obecny w systemie iOS 11.2.6.
Makalele,
47

Dla mnie, Resetting content and settingssymulator działa. Aby zresetować symulator, wykonaj następujące czynności:

Symulator iOS -> Resetuj zawartość i ustawienia -> Naciśnij Resetuj (po wyświetlonym ostrzeżeniu)

Manab Kumar Mal
źródło
29

W środowisku uruchomieniowym symulatora iOS 8.0 występuje błąd, przez który jeśli konfiguracja sieci ulegnie zmianie podczas uruchamiania symulowanego urządzenia, interfejsy API wyższego poziomu (np. CFNetwork) w symulowanym środowisku wykonawczym będą myśleć, że utraciły połączenie sieciowe. Obecnie zaleca się po prostu zrestartowanie symulowanego urządzenia po zmianie konfiguracji sieci.

Jeśli ten problem dotyczy Ciebie, zgłoś dodatkowe duplikaty radarów na stronie http://bugreport.apple.com, aby uzyskać wyższy priorytet.

Jeśli widzisz ten problem bez zmiany konfiguracji sieci, oznacza to, że nie jest to znany błąd i zdecydowanie powinieneś zgłosić radar, wskazujący, że problem nie jest znanym błędem po zmianie konfiguracji sieci.

Jeremy Huddleston Sequoia
źródło
7
Mam ten problem również na urządzeniu.
Darren
@ Darren To nie jest problem, o którym mówiłem. Proponuję złożyć radar.
Jeremy Huddleston Sequoia
4
podaj swój identyfikator radaru, aby ułatwić archiwizowanie duplikatów
Daniel Galasko,
11

Rozwiązałem problem polegający na ponownym uruchomieniu symulatora oraz zresetowaniu zawartości i ustawień.

m.eldehairy
źródło
Pomaga także zabić aplikację przed zresetowaniem symulatora i zrestartować komputer Mac. Często zmieniam miejsca z różnymi miejscami Wi-Fi i jest to procedura, która rozwiązuje problem.
Vladimír Slavík
11

Występuje również problem z wersją beta 5 i AFNetworking 1.3 podczas uruchamiania na symulatorze iOS 8, który powoduje błąd połączenia:

Domena = NSURLErrorDomain Code = -1005 „Połączenie sieciowe zostało utracone.”

Ten sam kod działa poprawnie na symulatorach iOS 7 i 7.1, a mój serwer proxy debugowania pokazuje, że awaria występuje przed próbą nawiązania połączenia (tzn. Nie są rejestrowane żadne żądania).

Śledziłem awarię NSURLConnection i zgłaszałem błąd do Apple. Zobacz wiersz 5 na załączonym obrazku:

Delegat klienta NSURLConnection nie powiódł się błąd.

Zmiana w użyciu https umożliwia połączenie z symulatorów iOS 8, choć występują sporadyczne błędy.

Problem nadal występuje w Xcode 6.01 (gm).

ptc
źródło
Widzę ten sam problem z NSURLSession i NSURLConnection, co wyklucza problem z AFNetworking. Odkryłem również, że działa z https, a nie działa z http. Nadal nie mogłem znaleźć żadnego rozwiązania, czy masz jakieś rozwiązanie?
VoidStack
Żadne rozwiązanie nie zgłosiło błędu, ponieważ błąd (18072300) doda komentarz o działaniu https, który jest dobrą informacją.
ptc
czy mógłbyś tutaj wkleić link do błędu? Dzięki, bo myślę, że mam ten sam problem, ale używam tylko NSURLConnection (i delegatów), ale otrzymuję ten sam komunikat o błędzie
szuniverse
Nie można udostępnić raportu o błędach Apple. Nadal otwarte i nadal obecne w XCODE 6 beta 7. Jeśli zgłosisz raport o błędzie, również to pomoże w priorytecie.
ptc
Wygląda na to, że ten problem występuje na symulatorze iOS i jestem zmęczony faktycznym urządzeniem, które działa dobrze. Dalsze debugowanie Znalazłem problem związany z portem na symulatorze iOS, port 443 https działa dobrze i użyłem 8080 dla HTTP, który kiedyś zawodził. Próbowałem użyć innych portów i mogłem nawiązać połączenie HTTP na symulatorze iOS. Wygląda na błąd w wersji beta Xcode 6, trzeba czekać na stabilny Xcode 6.
VoidStack
10

Wystąpił ten problem podczas używania Alamofire. Mój błąd polegał na tym, że wysyłałem pusty słownik [:]parametrów na GETżądanie, a nie wysyłałemnil parametry.

Mam nadzieję że to pomoże!

yujean
źródło
GET i POST z pustym słownikiem treści [:] powodują losowy błąd. Używam Python Flask dla interfejsów API REST zaplecza, to też może być przydatne.
Mahmoud Fayez,
10

Otwarcie Charlesa rozwiązało dla mnie problem, co wydaje się bardzo dziwne ...

Charles to serwer proxy HTTP / monitor HTTP / zwrotny serwer proxy, który umożliwia programistom przeglądanie całego ruchu HTTP i SSL / HTTPS między komputerem a Internetem. Obejmuje to żądania, odpowiedzi i nagłówki HTTP (które zawierają pliki cookie i informacje o buforowaniu).

Colin Tremblay
źródło
1
Myślę, że to też działa, ponieważ ponieważ Charles używa certyfikatu ssl do proxy żądań sumatora, działa podobnie do https
thisispete
1
To działa dla mnie za każdym razem! Próbowałem 30 razy i działa 30 z 30. Myślałem, że to fuks, ale dobrze wiedzieć, że to po prostu nie jestem ja.
jdog
2
Charles to narzędzie proxy, które pozwala obserwować ruch z maszyny. Sprawdzić charlesproxy.com szczegóły. Certyfikat Charles SSL może zakłócać zdolność symulatora do wysyłania żądań sieciowych.
Colin Tremblay,
@ColinTremblay Myślę, że twój symulator / urządzenie jest skonfigurowane do używania proxy. Usunięcie proxy również będzie działać.
bikram990
Śmiesznie, to też zadziałało dla mnie. Musiał mieć Charlesa otwartego, a następnie zresetować ustawienia iOS Simulator.
Matt Andrews,
6

Zobacz komentarz pjebs do 5 stycznia na Github.

Metoda 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;
}

Również niektóre sugerują ponowne połączenie z witryną,

tj. dwa razy uruchomienie żądania POST

Rozwiązanie: Użyj metody, aby nawiązać połączenie z witryną, zwróć (id), jeśli połączenie sieciowe zostało utracone, wróć, aby użyć tej samej metody.

Metoda 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;
     }

}
HDdeveloper
źródło
Metoda 1 bardzo mi pomogła .. Dzięki
Abhishek Mitra
4

Ten błąd również występował, ale na rzeczywistych urządzeniach, a nie na symulatorze. Zauważyliśmy błąd podczas uzyskiwania dostępu do naszego zaplecza heroku na HTTPS (serwer gunicorn) i wykonywania POSTS z dużymi ciałami (cokolwiek powyżej 64Kb). Używamy uwierzytelniania podstawowego HTTP do uwierzytelnienia i zauważyliśmy, że błąd został rozwiązany NIE przez użycie didReceiveChallenge:metody delegowania na sesji NSURLSession, ale raczej poprzez wypalenie uwierzytelnienia w oryginalnym nagłówku żądania poprzez dodanie Authentiation: Basic <Base64Encoded UserName:Password>. Zapobiega to niezbędnemu 401 do wyzwolenia didReceiveChallenge:komunikatu delegowanego i utraty połączenia sieciowego.

rvijay007
źródło
Dziękuję bardzo za cenny komentarz. Masz rację, jeśli załaduję ciąg base64 obrazu poniżej 64 kb, zostanie on przesłany pomyślnie.
Vinayak Bhor
3

Miałem ten sam problem. Rozwiązanie było proste, mam ustawione HTTPBody, ale nie jest ustawiona HTTPMethodna POST. Po naprawieniu wszystko było w porządku.

Timur Bernikowicz
źródło
3

Miałem ten sam problem. Nie wiem, jak AFNetworking implementuje żądanie https, ale moim powodem jest problem pamięci podręcznej NSURLSession.

Po tym, jak moja aplikacja wyśledzi z safari, a następnie opublikuje żądanie HTTP, pojawi się błąd „HTTP load failed 1005”. Jeśli przestanę używać "[NSURLSession sharedSession]", ale aby użyć konfigurowalnej instancji NSURLSession w celu wywołania metody „dataTaskWithRequest:” w następujący sposób, problem zostanie rozwiązany.

NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
config.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
config.URLCache = nil;
self.session = [NSURLSession sessionWithConfiguration:config];

Pamiętaj tylko, aby ustawić config.URLCache = nil;.

Jia Xiao
źródło
1
Myślę, że wszyscy, którzy ponownie uruchamiają urządzenie / symulator lub resetują dane, powinni zapoznać się z tą odpowiedzią. Wydaje mi się, że wszystkie ich działania usuwają pamięć podręczną, co faktycznie rozwiązuje problem. Prawdopodobnie jest to problem z pamięcią podręczną adresu URL. Teraz to przetestuję.
Kamran Khan
2

Musiałem wyjść z XCode, usunąć zawartość folderu DerivedData (~ / Library / Developer / Xcode / DerivedData lub / Library / Developer / Xcode / DerivedData) i wyjść z symulatora, aby to zadziałało.

abinop
źródło
1
Jedyną istotną akcją na tej liście było ponowne uruchomienie symulatora. Ponowne uruchomienie Xcode i usuwanie danych pochodnych jest nadmierne.
Jeremy Huddleston Sequoia
2

Mam ten problem również na urządzeniu z systemem iOS 8. Jest on bardziej szczegółowy tutaj i wydaje się, że jest to przypadek, gdy iOS próbuje użyć połączeń, które już upłynęły limit czasu. Mój problem nie jest taki sam jak problem Keep-Alive wyjaśniony w tym linku, jednak wydaje się, że jest to ten sam efekt końcowy.

Rozwiązałem problem, uruchamiając blok rekurencyjny za każdym razem, gdy pojawia się błąd -1005, co powoduje, że połączenie ostatecznie się przebija, nawet jeśli czasami rekurencja może zapętlać się ponad 100 razy, zanim połączenie zadziała, jednak dodaje tylko sekundę do uruchomienia razy i założę się, że jest to czas, w którym debuger drukuje dla mnie NSLog.

Oto jak uruchamiam blok rekurencyjny za pomocą AFNetworking: Dodaj ten kod do pliku klasy połączenia

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

Następnie użyj tego lubi to:

+ (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);
}

Zobaczysz, że korzystam z AFHTTPRequestOperationpodklasy, ale dodaj własny kod żądania. Ważną częścią jest wywołanie, recurse(@offset.intValue+1));aby ponownie wywołać blok.

Darren
źródło
Co to jest klasa MyAFHTTPRequestOperation?
jdog
To tylko podklasa AFHTTPRequestOperation. Używam go do predefiniowania niektórych rzeczy, takich jak limit czasu i uwierzytelnianie.
Darren,
2

Jeśli problem występuje na urządzeniu, sprawdź, czy ruch przechodzi przez serwer proxy (Ustawienia> Wi-Fi> (informacje)> Serwer proxy HTTP). Miałem konfigurację urządzenia do pracy z Charlesem, ale zapomniałem o proxy. Wydaje się, że bez Charles faktycznie działa ten błąd występuje.

David James
źródło
2

Jeśli ktoś otrzymuje ten błąd podczas przesyłania plików na serwer zaplecza, upewnij się, że serwer odbierający ma maksymalny rozmiar zawartości, który jest dozwolony dla Twojego nośnika. W moim przypadku NGINX wymagał wyższej client_max_body_size. NGINX odrzuci żądanie przed zakończeniem przesyłania, więc kod błędu nie powróci.

Raymond26
źródło
2

Podczas używania Xcode 6.2 beta pojawiał się błąd na urządzeniu z systemem iOS 7.

Powrót z Xcode 6.2 beta do 6.1.1 naprawił problem, przynajmniej na urządzeniu z iOS 7.

Anton Tropashko
źródło
Nie sądzę, aby było coś do rozwiązania: podstawowy system operacyjny przerywa połączenie z uzasadnionego powodu, czy nie. Aplikacja powinna być przygotowana na poradzenie sobie z tym (praca offline lub cokolwiek innego). Zakładając, że SDK w twojej konkretnej wersji xcode nie jest błędny: jak moja odpowiedź sugeruje, że 6.2 był prawdopodobnie błędny, podczas gdy 6.1.1 był dobry. Coś podobnego można teraz zaobserwować, gdy xcode 6.4 wydaje się dość stabilny, podczas gdy 7.0.1 jest oprogramowaniem klasy alfa. A przynajmniej tak się wydaje.
Anton Tropashko
2

Na 2017-01-25Apple opublikował techniczne pytania i odpowiedzi dotyczące tego błędu:

Techniczne pytania i odpowiedzi Apple QA1941

Obsługa błędów „Utracono połączenie sieciowe” Błędy

Odp .: NSURLErrorNetworkConnectionLost ma błąd -1005 w domenie błędów NSURLErrorDomain i jest wyświetlany użytkownikom jako „Utracono połączenie sieciowe”. Ten błąd oznacza, że ​​podstawowe połączenie TCP, które przenosi żądanie HTTP, zostało rozłączone podczas trwania żądania HTTP (więcej informacji na ten temat znajduje się poniżej). W niektórych okolicznościach NSURLSession może ponawiać takie żądania automatycznie (szczególnie jeśli żądanie jest idempotentne), ale w innych okolicznościach nie jest to dozwolone przez standardy HTTP.

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

pkamb
źródło
1

Dostrzegaliśmy problem od miesięcy i wreszcie odkryliśmy, że kiedy wyłączamy DNSSEC w naszej domenie API, wszystko było w porządku: simple_smile:

Brivael Le Pogam
źródło
2
Czy możesz prosić o opracowanie?
Groot
1

Łączyłem się przez VPN. Wyłączenie VPN rozwiązało problem.

alpere
źródło
1

Trafiłem w ten błąd podczas przekazywania NSURLRequest do NSURLSession bez ustawiania metody HTTP żądania .

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

Error Domain = NSURLErrorDomain Code = -1005 „Połączenie sieciowe zostało utracone.”

Dodaj HTTPMethodjednak, a połączenie działa poprawnie

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:urlComponents.URL];
[request setHTTPMethod:@"PUT"];
pkamb
źródło
1

Sprawdź, czy możesz poprosić o to z innych aplikacji (np. Safari). Jeśli nie, może być coś na twoim komputerze. W moim przypadku miałem ten problem z programem Avast Antivirus, który blokował moje żądanie symulatorów (nie pytaj mnie dlaczego).

Hola Soy Edu Feliz Navidad
źródło
1

Ponowne uruchomienie komputera rozwiązało problem z Xcode9.1. Uruchomiłem ponownie symulator i Xcode, to nie działa.

młody
źródło
1

Miałem do czynienia z tym samym problemem, włączyłem Network Link Conditioner do powolnego testowania sieci dla aplikacji. To powodowało błąd czasami, kiedy go wyłączyłem Settings > Developer > Network Link Conditioner, rozwiązało to mój problem.

wprowadź opis zdjęcia tutaj

Mam nadzieję, że komuś to pomoże.

Dhaval Bhimani
źródło
1

W moim przypadku było tak, ponieważ łączyłem się z HTTP i działało na HTTPS

luky
źródło
0

Miałem ten problem z następującego powodu.

TLDR: Sprawdź, czy wysyłasz GETżądanie, które powinno przesyłać parametry w adresie URL zamiast w NSURLRequest's HTTBodywłaściwości.

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

W aplikacji zainstalowałem abstrakcję sieci i działała całkiem dobrze w przypadku wszystkich moich próśb.

Dodałem nowe żądanie do innej usługi sieci Web (innej niż moja) i zaczęło mi to generować ten błąd.

Poszedłem na plac zabaw i zacząłem od podstaw, budując prośbę od podstaw, i zadziałało. Zacząłem więc przybliżać się do mojej abstrakcji, dopóki nie znalazłem przyczyny.

W mojej implementacji abstrakcji wystąpił błąd: wysyłałem żądanie, które miało wysłać parametry zakodowane w adresie URL, a także wypełniałem NSURLRequest's HTTBodywłaściwość parametrami zapytania. Jak tylko usunąłem HTTPBody, zadziałało.

Nuno Gonçalves
źródło
0

Otrzymałem ten błąd, a także zauważyłem, że aplikacja Postman również spadała, ale pracowała w aplikacji Advanced Rest Client (ARC) i działała na Androidzie. Musiałem więc zainstalować Charlesa do debugowania komunikacji i zauważyłem, że kod odpowiedzi wynosił -1. Problem polegał na tym, że programista REST zapomniał zwrócić kod odpowiedzi 200.

Mam nadzieję, że pomoże to innym programistom.

Tiago Mendes
źródło
0

Ilekroć pojawia się błąd -1005, należy ponownie wywołać 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... 
       }
  }];

Musisz ponownie dodać kod, aby wywołać funkcję ponownie. Upewnij się, że byłeś kiedyś metodą wywołania, w przeciwnym razie jej pętla rekurencyjna.

Piyush
źródło
0

Oprócz wszystkich odpowiedzi znalazłem jedno fajne rozwiązanie. W rzeczywistości problem związany z niepowodzeniem połączenia sieciowego dla słowa systemu iOS 12 jest spowodowany błędem w słowie systemu iOS 12.0. I to jeszcze nie rozwiązane. Przeszedłem przez społeczność git hub dla problemu związanego z siecią AFNetworking, gdy aplikacja pochodzi z tła i próbuje nawiązać połączenie sieciowe i nie udaje się nawiązać połączenia. Spędzam na tym 3 dni i próbuję wielu rzeczy, aby dotrzeć do pierwotnej przyczyny tego i nic nie znalazłem. W końcu mam trochę światła w ciemności, kiedy redaguję tego bloga https://github.com/AFNetworking/AFNetworking/issues/4279

Mówi, że w iOS 12. jest błąd. Zasadniczo nie można oczekiwać, że połączenie sieciowe zostanie zakończone, jeśli aplikacja nie będzie na pierwszym planie. Z powodu tego błędu połączenia sieciowe są przerywane, aw dziennikach pojawia się awaria sieci.

Moją najlepszą sugestią jest opóźnienie, gdy aplikacja przechodzi z tła na pierwszy plan i występuje połączenie sieciowe. Wykonaj asynchroniczne połączenie sieciowe w wysyłce z pewnym opóźnieniem. Nigdy nie dostaniesz połączenia sieciowego ani utraty połączenia.

Nie czekaj, aż Apple pozwoli rozwiązać ten problem w systemie iOS 12, ponieważ wciąż nie został rozwiązany. Możesz obejść to obejście, zapewniając pewne opóźnienie dla żądania sieciowego, jakim jest jego NSURLConnection, NSURLSession lub AFNetworking lub ALAMOFIRE. Twoje zdrowie :)

Świadomy Shankar
źródło
0

Ten sam problem napotkałem podczas rozmowy za pomocą serwera mojej firmy z aplikacji iOS 12 na urządzeniu fizycznym. Problem polegał na tym, że dysk twardy serwera był pełny. Zwolnienie miejsca na serwerze rozwiązało problem.

Znalazłem ten sam błąd w innej sytuacji, myślę, że z powodu przekroczenia limitu czasu, którego nie można sparametryzować za pomocą standardowego interfejsu API sieci dostarczonego przez Apple ( URLSession.timeoutIntervalForRequesti URLSession.timeoutIntervalForResource). Nawet tam .. odpowiedź serwera szybciej rozwiązała problem

Mattia Personaggio Uno Ducci
źródło