web-dev-qa-db-de.com

Fehler Domain = NSURLErrorDomain Code = -1005 "Die Netzwerkverbindung wurde unterbrochen."

Ich habe eine Anwendung, die unter Xcode6-Beta1 und Xcode6-Beta2 sowohl mit iOS7 als auch mit iOS8 funktioniert. Aber mit Xcode6-Beta3, Beta4, Beta5 habe ich Probleme mit iOS8, aber alles funktioniert gut auf iOS7. Ich erhalte den Fehler "The network connection was lost.". Der Fehler lautet wie folgt:

Fehler: Fehler Domain = NSURLErrorDomain Code = -1005 "Die Netzwerkverbindung ist unterbrochen worden." UserInfo = x7ba8e5b0 {NSErrorFailingURLStringKey =, _kCFStreamErrorCodeKey = 57, NSErrorFailingURLKey =, NSLocalizedDescription = Die Netzwerkverbindung ist verloren gegangen.

Ich verwende AFNetworking 2.x und den folgenden Code-Ausschnitt, um den Netzwerkanruf zu tätigen:

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

Ich habe NSURLSession ausprobiert, erhalte aber immer noch die gleiche Fehlermeldung.

248
VoidStack

Durch den Neustart des Simulators wurde das Problem für mich behoben.

411
Collin

Wir hatten genau diesen Fehler und es stellte sich heraus, dass dies ein Problem bei der zugrunde liegenden HTTP-Implementierung von NSURLRequest war:

Soweit wir feststellen können, dass iOS 8/9/10/11 eine HTTP-Antwort mit einem Keep-Alive-Header erhält, behält diese Verbindung diese Verbindung für eine spätere Wiederverwendung bei (wie es sollte), jedoch für mehr als den Parameter timeout des Keep-Alive-Headers (er scheint die Verbindung immer für 30 Sekunden am Leben zu erhalten.) .__ Wenn eine zweite Anforderung weniger als 30 Sekunden später von der App gesendet wird, versucht sie, eine eventuell vorhandene Verbindung erneut zu verwenden wurde vom Server gelöscht (falls mehr als der Keep-Alive vergangen ist).

Hier sind die Lösungen, die wir bisher gefunden haben:

  • Erhöhen Sie den Timeout-Parameter des Servers über 30 Sekunden. Es scheint, als würde sich iOS immer so verhalten, als ob der Server die Verbindung für 30 Sekunden offen hält, unabhängig von dem im Keep-Alive-Header angegebenen Wert. (Dies kann für Apache durch Setzen der Option KeepAliveTimeout durchgeführt werden.
  • Sie können den Keep-Alive-Mechanismus für iOS-Clients einfach deaktivieren, basierend auf dem User-Agent Ihrer App (z. B. für Apache: BrowserMatch "iOS 8\." nokeepalive in der Mod-Datei setenvif.conf).
  • Wenn Sie keinen Zugriff auf den Server haben, können Sie versuchen, Ihre Anforderungen mit einem Connection: close-Header zu senden: Dadurch wird der Server angewiesen, die Verbindung sofort zu trennen und ohne Keep Alive-Header zu antworten. ABER im Moment scheint NSURLSession den Header Connection zu überschreiben, wenn die Anforderungen gesendet werden (wir haben diese Lösung nicht ausgiebig getestet, da wir die Apache-Konfiguration anpassen können).
211
Arthur

Bei mir funktioniert Resetting content and settings des Simulators . Um den Simulator zurückzusetzen, gehen Sie folgendermaßen vor:

iOS-Simulator -> Inhalt und Einstellungen zurücksetzen -> Zurücksetzen drücken (auf der Warnung )

47
Manab Kumar Mal

Die Simulator-Laufzeitumgebung von iOS 8.0 weist einen Fehler auf. Wenn sich Ihre Netzwerkkonfiguration ändert, während das simulierte Gerät gestartet wird, glauben höhere APIs (z. B. CFNetwork) in der simulierten Laufzeit, dass die Netzwerkverbindung verloren gegangen ist. Derzeit wird empfohlen, das simulierte Gerät einfach neu zu starten, wenn sich Ihre Netzwerkkonfiguration ändert.

Wenn Sie von diesem Problem betroffen sind, reichen Sie bitte weitere doppelte Radarsysteme unter http://bugreport.Apple.com ein, um die Priorität zu erhöhen.

Wenn Sie dieses Problem sehen, ohne dass die Netzwerkkonfigurationen geändert hat, ist dies kein bekannter Fehler, und Sie sollten auf jeden Fall ein Radargerät einreichen, das darauf hinweist, dass es sich nicht um den bekannten Fehler der Netzwerkkonfiguration handelt.

Haben Sie auch ein Problem mit Beta 5 und AFNetworking 1.3, wenn Sie auf einem iOS 8-Simulator laufen, das zu einem Verbindungsfehler führt:

Domain = NSURLErrorDomain Code = -1005 "Die Netzwerkverbindung ist unterbrochen worden."

Derselbe Code funktioniert auf iOS 7- und 7.1-Simulatoren einwandfrei. Mein Debugging-Proxy zeigt an, dass der Fehler auftritt, bevor tatsächlich eine Verbindung hergestellt wird (d. H. Keine protokollierten Anforderungen).

Ich habe den Fehler bei NSURLConnection verfolgt und einen Fehler an Apple gemeldet. Siehe Zeile 5 im angehängten Bild:

NSURLConnection client delegate did fail error

Die Änderung zur Verwendung von https ermöglicht die Verbindung von iOS 8-Simulatoren, allerdings mit zeitweiligen Fehlern.

Problem ist immer noch in Xcode 6.01 (gm) vorhanden.

11
ptc

was für mich das Problem gelöst hat, war, den Simulator neu zu starten und den Inhalt und die Einstellungen zurückzusetzen.

10
m.eldehairy

Eröffnung Charles hat das Problem für mich gelöst, was sehr seltsam erscheint ...

Charles ist ein HTTP-Proxy/HTTP-Monitor/Reverse-Proxy, mit dem Entwickler den gesamten HTTP- und SSL/HTTPS-Verkehr zwischen ihrem Computer und dem Internet anzeigen können. Dazu gehören Anfragen, Antworten und die HTTP-Header (die die Cookies und Caching-Informationen enthalten).

9
Colin Tremblay

Dieses Problem trat bei der Verwendung von Alamofire auf. Mein Fehler war, dass ich ein leeres Wörterbuch [:] für die Parameter einer GET-Anforderung sendete, anstatt nil-Parameter zu senden.

Hoffe das hilft!

6
yujean

Siehe pjebs Kommentar zu Github am 5. Januar.

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

Einige schlagen auch vor, sich erneut mit der Site zu verbinden. 

d. h. Die Anforderung von POST wird zweimal ausgeführt.

Lösung: Verwenden Sie eine Methode, um eine Verbindung zum Standort herzustellen, return (id). Wenn die Netzwerkverbindung unterbrochen wurde, kehren Sie zur Verwendung derselben Methode zurück.

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

}
6
HDdeveloper

Ich hatte das gleiche Problem. Ich weiß nicht, wie AFNetworking die https-Anfrage implementiert, aber der Grund für mich ist das Cache-Problem der NSURLSession. 

Nachdem meine Anwendung von der Safari zurückverfolgt und dann eine http-Anforderung veröffentlicht hat, wird der Fehler "http load failed 1005" angezeigt. Wenn ich "[NSURLSession sharedSession]" nicht mehr benutze, aber eine konfigurierbare NSURLSession-Instanz zum Aufruf der Methode "dataTaskWithRequest:" wie folgt verwendet, das Problem ist gelöst.

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

Denken Sie daran, config.URLCache = nil; einzustellen.

3
Jia Xiao

Ich habe diese Fehlermeldung auch erhalten, aber auf tatsächlichen Geräten und nicht im Simulator. Wir haben den Fehler bemerkt, als wir auf unser Heroku-Backend auf HTTPS (gunicorn-Server) zugreifen und POSTS mit großen Bodys (alles über 64 KB) ausführen. Wir verwenden HTTP Basic Auth für die Authentifizierung und stellten fest, dass der Fehler behoben wurde, indem NICHT die Delegatenmethode didReceiveChallenge: für NSURLSession verwendet wurde. Stattdessen wurde die Authentifizierung durch Hinzufügen von Authentiation: Basic <Base64Encoded UserName:Password> in den ursprünglichen Anforderungsheader eingebettet. Dadurch wird verhindert, dass 401 die didReceiveChallenge:-Delegatnachricht auslösen muss, und die nachfolgende Netzwerkverbindung verloren geht.

3
rvijay007

Ich hatte das gleiche Problem. Die Lösung war einfach, ich habe HTTPBody eingestellt, aber HTTPMethod nicht auf POST gesetzt. Nachdem ich das behoben hatte, war alles in Ordnung.

3

Ich musste XCode beenden, den Inhalt des DerivedData-Ordners löschen (~/Library/Developer/Xcode/DerivedData oder/Library/Developer/Xcode/DerivedData) und den Simulator beenden, damit dies funktioniert.

2
abinop

Ich habe auch dieses Problem, das auf einem iOS 8-Gerät ausgeführt wird . Es wird ausführlicher beschrieben - hier und scheint ein Fall zu sein, in dem iOS versucht, Verbindungen zu verwenden, die bereits abgelaufen sind . Mein Problem ist nicht Es ist nicht dasselbe wie das in diesem Link erläuterte Keep-Alive-Problem, scheint jedoch dasselbe Endergebnis zu sein.

Ich habe mein Problem korrigiert, indem ich einen rekursiven Block ausführte, wenn ich einen Fehler -1005 erhalte. Dadurch wird die Verbindung letztendlich durchgezogen, auch wenn die Rekursion manchmal mehr als 100 Mal wiederholt werden kann, bevor die Verbindung funktioniert mal und ich wette, das ist genau die Zeit, die der Debugger benötigt, um die NSLog's für mich zu drucken.

So führe ich einen rekursiven Block mit AFNetworking aus: Fügen Sie diesen Code zu Ihrer Verbindungsklassendatei hinzu

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

Dann benutze es gerne so:

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

Sie werden sehen, dass ich eine AFHTTPRequestOperation-Unterklasse verwende, aber Ihren eigenen Anforderungscode hinzufüge. Der wichtige Teil ist der Aufruf von recurse(@offset.intValue+1));, damit der Block erneut aufgerufen wird.

2
Darren

Wenn jemand beim Hochladen von Dateien auf einen Backend-Server diesen Fehler erhält, stellen Sie sicher, dass der empfangende Server eine maximale Inhaltsgröße hat, die für Ihre Medien zulässig ist. In meinem Fall benötigte NGINX einen höheren client_max_body_size. NGINX würde die Anforderung vor dem Hochladen zurückweisen, sodass kein Fehlercode zurückgegeben wurde.

2
Raymond26

Ich habe den Fehler auf einem iOS 7-Gerät erhalten, als ich Xcode 6.2 Beta verwendete.

Der Wechsel von Xcode 6.2 Beta auf 6.1.1 behebte das Problem, zumindest auf einem iOS 7-Gerät.

2
Anton Tropashko

Ich habe das Problem seit Monaten erhalten und schließlich festgestellt, dass alles in Ordnung war, wenn wir DNSSEC in unserer API-Domäne deaktivieren: simple_smile:

1

Dieser Fehler ist aufgetreten, als ein NSURLRequest an eine NSURLSession übergeben wurde, ohne die HTTPMethod der Anforderung festzulegen.

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

Fehler Domain = NSURLErrorDomain Code = -1005 "Die Netzwerkverbindung wurde unterbrochen."

Fügen Sie jedoch die Variable HTTPMethod hinzu, und die Verbindung funktioniert einwandfrei

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

Ich habe mich über ein VPN verbunden. Das Deaktivieren des VPNs hat das Problem gelöst.

1
alpere

Testen Sie, ob Sie von anderen Apps (z. B. Safari) anfordern können. Wenn nicht, könnte etwas auf Ihrem Computer sein. In meinem Fall hatte ich dieses Problem mit Avast Antivirus, das die Anforderung meiner Simulatoren blockierte.

Durch den Neustart des Computers wurde das Problem mit Xcode9.1 behoben. Ich hatte den Simulator und Xcode neu gestartet, es funktioniert nicht.

1
young

Wenn das Problem auf einem Gerät auftritt, prüfen Sie, ob der Datenverkehr über einen Proxy erfolgt (Einstellungen> Wi-Fi> (Info)> HTTP-Proxy). Ich hatte mein Gerät für Charles eingerichtet, hatte aber den Proxy vergessen. Es scheint, dass dieser Fehler ohne Charles tatsächlich auftritt.

1
David James

Ich erhielt diesen Fehler und bemerkte auch, dass die Anwendung Postman ebenfalls herunterfiel, aber in der App Advanced Rest Client (ARC) und in Android .. arbeitete. Also musste ich Charles installieren, um die Kommunikation zu debuggen, und ich bemerkte den Antwortcode war -1 ..__ Das Problem war, dass der Programmierer REST vergessen hat, den Antwortcode 200 zurückzugeben.

Ich hoffe, das hilft anderen Entwicklern.

0
Tiago Mendes

In meinem Fall war es, weil ich eine Verbindung zu HTTP herstellte und es auf HTTPS lief

0
luky

Ich stand vor demselben Problem, Ich habe Network Link Conditioner für langsame Netzwerktests für die App aktiviert. Das hat diesen Fehler einige Male verursacht, Wenn ich ihn von Settings > Developer > Network Link Conditioner deaktiviert habe, wurde mein Problem gelöst.

 enter image description here

Hoffe das hilft jemandem.

0
Dhaval Bhimani

Ich hatte das gleiche Problem, als ich mit einem physischen Gerät über die iOS 12-App auf dem Server meines Unternehmens anrief. Das Problem war, dass die Server-Festplatte voll war. Das Freigeben von Speicherplatz auf dem Server hat das Problem behoben.

Ich habe den gleichen Fehler in einer anderen Situation gefunden, die meiner Meinung nach auf eine Zeitüberschreitung zurückzuführen ist, die über die von Apple bereitgestellte Standard-Netzwerk-API (URLSession.timeoutIntervalForRequest und URLSession.timeoutIntervalForResource) nicht parametrierbar ist. Auch dort .. hat die Serverantwort schneller das Problem gelöst

Auf 2017-01-25 hat Apple eine technische F & A zu diesem Fehler veröffentlicht:

Technische Fragen und Antworten zu Apple QA1941

Umgang mit „Die Netzwerkverbindung war unterbrochen“ Fehler

A: NSURLErrorNetworkConnectionLost hat den Fehler -1005 in der NSURLErrorDomain-Fehlerdomäne und wird den Benutzern als "Die Netzwerkverbindung war unterbrochen" angezeigt. Dieser Fehler bedeutet, dass die zugrunde liegende TCP - Verbindung, die die HTTP-Anforderung trägt, während der HTTP-Anforderung getrennt wurde (weitere Informationen hierzu finden Sie unten). In einigen Fällen kann NSURLSession solche Anforderungen automatisch erneut versuchen (insbesondere wenn die Anforderung idempotent ist), unter anderen Umständen ist dies jedoch nach den HTTP-Standards nicht zulässig.

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

0
pkamb

Ich hatte dieses Problem aus folgendem Grund. 

TLDR: Überprüfen Sie, ob Sie eine GET-Anforderung senden, die die Parameter für die URL und nicht für die NSURLRequest's HTTBody-Eigenschaft senden soll.

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

Ich hatte eine Netzwerk-Abstraktion für meine App installiert, und sie funktionierte für alle meine Anforderungen ziemlich gut.

Ich fügte eine neue Anfrage zu einem anderen Webdienst hinzu (nicht zu meinem eigenen) und es wurde mir dieser Fehler gemeldet. 

Ich ging zu einem Spielplatz und baute von Grund auf eine Barebones-Anfrage auf, und es funktionierte. Also ging ich näher an meine Abstraktion heran, bis ich die Ursache gefunden hatte.

Meine Abstraktionsimplementierung hatte einen Fehler: Ich sendete eine Anfrage, die in der URL kodierte Parameter senden sollte, und füllte die NSURLRequest's HTTBody-Eigenschaft auch mit den Abfrageparametern. Sobald ich HTTPBody entfernte es funktionierte.

0
Nuno Gonçalves