web-dev-qa-db-ja.com

"エラードメイン= NSURLErrorDomain Code = -1005"ネットワーク接続が切断されました。 "

私はiOS7とiOS8の両方でXcode6-Beta1とXcode6-Beta2でうまく動作するアプリケーションを持っています。しかし、Xcode 6-Beta 3、Beta 4、Beta 5では、私はiOS 8でネットワークの問題に直面していますが、iOS 7でもすべてうまくいきます。エラー"The network connection was lost."が発生します。エラーは以下のとおりです。

エラー:エラーDomain = NSURLErrorDomain Code = -1005 "ネットワーク接続が失われました。" UserInfo = 0x7ba8e5b0 {NSErrorFailingURLStringKey =、_kCFStreamErrorCodeKey = 57、NSErrorFailingURLKey =、NSLocalizedDescription =ネットワーク接続が切断されました。

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を試しましたが、それでも同じエラーが表示されます。

251
VoidStack

シミュレータを再起動すると問題が解決しました。

412
Collin

この正確なエラーがあり、NSURLRequestの基礎となるHTTP実装の問題であることが判明しました。

私たちが知る限り、iOS 8/9/10/11はKeep-Aliveヘッダーを含むHTTP応答を受信すると、この接続を保持し、後で再利用する必要がありますが、それ以上保持しますKeep-Aliveヘッダーのtimeoutパラメーターよりも(常に接続を30秒間有効に保つように思われます。)30秒以内にアプリから2番目のリクエストが送信されると、再利用を試みます。サーバーによってドロップされた可能性のある接続(実際のKeep-Aliveを超えた場合)。

これまでに見つかった解決策は次のとおりです。

  • サーバーのタイムアウトパラメータを30秒以上に増やします。 iOSは、Keep-Aliveヘッダーで指定された値に関係なく、サーバーが接続を30秒間開いたままにしているかのように常に動作しているように見えます。 (これはApacheに対してKeepAliveTimeoutオプションを設定することで実行できます。
  • アプリのUser-Agentに基づいてiOSクライアントのキープアライブメカニズムを単純に無効にすることができます(例:Apacheの場合:MODファイルのBrowserMatch "iOS 8\." nokeepalivesetenvif.conf
  • サーバーにアクセスできない場合は、Connection: closeヘッダーを使用してリクエストを送信してみてください。これにより、サーバーに接続をすぐに切断し、キープアライブヘッダーなしで応答するように指示します。ただし、現時点では、NSURLSessionは、リクエストが送信されるときにConnectionヘッダーをオーバーライドするようです(Apacheの構成を微調整できるため、このソリューションを広範囲にテストしませんでした)
218
Arthur

私の場合は、SimulatorのResetting content and settingsが動作します。シミュレータをリセットするには、次の手順に従います。

iOSシミュレータ - >コンテンツと設定のリセット - >リセットが表示される

47
Manab Kumar Mal

IOS 8.0シミュレータランタイムには、シミュレートされたデバイスの起動中にネットワーク設定が変更されると、シミュレートされたランタイムの上位レベルのAPI(例:CFNetwork)がネットワーク接続を失ったと見なすというバグがあります。現在、推奨される回避策は、ネットワーク設定が変更されたときにシミュレートされたデバイスを単に再起動することです。

この問題の影響を受けている場合は、優先度を上げるために http://bugreport.Apple.com に追加の重複レーダーを登録してください。

この問題がなしでネットワーク設定を変更しているのであれば、それは既知のバグではないので、間違いなくレーダーを提出してください。これは既知のnetwork-configuration-changedバグではないことを示しています。

IOS 5シミュレータ上で実行しているときにベータ5およびAFNetworking 1.3にも接続エラーが発生するという問題もあります。

"Domain = NSURLErrorDomain Code = -1005"ネットワーク接続が切断されました。

IOS 7と7.1のシミュレータでも同じコードで問題なく動作します。私のデバッグプロキシは、接続が実際に試行される前に失敗が発生することを示します(つまり、要求が記録されません)。

NSURLConnectionの失敗を追跡し、バグをAppleに報告しました。添付画像の5行目を参照してください。

NSURLConnection client delegate did fail error

httpsを使用するように変更すると、断続的なエラーがあってもiOS 8シミュレータからの接続が可能になります。

Xcode 6.01(gm)にはまだ問題があります。

11
ptc

私にとって問題を解決したのは、シミュレータを再起動し、内容と設定をリセットすることでした。

10
m.eldehairy

Charlesを開く /私のために問題を解決した、それは非常に奇妙に思える….

Charlesは、開発者が自分のマシンとインターネットの間のHTTPおよびSSL/HTTPSトラフィックをすべて表示できるようにするHTTPプロキシ/ HTTPモニター/リバースプロキシです。これには、リクエスト、レスポンス、およびHTTPヘッダー(Cookieとキャッシュ情報を含む)が含まれます。

9
Colin Tremblay

Alamofireを使用している間、私はこの問題を経験していました。私の間違いは、GETパラメータを送信するのではなく、nilリクエストのパラメータに対して空の辞書[:]を送信していたことです。

お役に立てれば!

9
yujean

1月5日にGithubで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要求を2回実行する

解決策:サイトに接続するためのメソッド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;
     }

}
6
HDdeveloper

私は同じ問題を抱えていました。 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;を設定することを忘れないでください。

3
Jia Xiao

私もこのエラーを受けていましたが、シミュレータではなく実際のデバイス上で。 HTTPS(gunicornサーバー)で私達のherokuバックエンドにアクセスした時、そして大きなボディ(64Kb以上のもの)でPOSTSをした時のエラーに気づきました。認証にHTTP基本認証を使用していますが、NSURLSessionでdidReceiveChallenge:デリゲートメソッドを使用せずに、Authentiation: Basic <Base64Encoded UserName:Password>を追加して認証を元の要求ヘッダーに焼き付けることでエラーが解決されたことに気付きました。これはdidReceiveChallenge:デリゲートメッセージを引き起こすのに必要な401とそれに続くネットワーク接続が失われるのを防ぎます。

3
rvijay007

私は同じ問題を抱えていました。解決策は簡単で、HTTPBodyを設定しましたが、HTTPMethodPOSTに設定していません。これを修正した後、すべてが大丈夫だった。

3

XCodeを終了し、DerivedDataフォルダの内容(〜/ Library/Developer/Xcode/DerivedDataまたは/ Library/Developer/Xcode/DerivedData)を削除してシミュレータを終了する必要がありました。

2
abinop

私もこの問題を抱えていて、iOS 8デバイスで実行しています。もう少し詳しく説明します - ここ そしてiOSがすでにタイムアウトした接続を使おうとしているようです。私の問題はそのリンクで説明されているキープアライブの問題と同じではありませんが、それは同じ最終結果のようです。

エラー-1005を受け取るたびに再帰ブロックを実行することで問題を解決しました。これにより、接続が機能するまでに再帰が100回以上ループすることがありますが、接続は最終的に通過しますこれは、デバッガが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));を呼び出すことです。

2
Darren

バックエンドサーバーにファイルをアップロードしているときに誰かがこのエラーを受け取っている場合は、受信サーバーがあなたのメディアに許容される最大コンテンツサイズを持っていることを確認してください。私の場合、NGINXにはもっと高いclient_max_body_sizeが必要でした。アップロードが完了する前にNGINXがリクエストを拒否したため、エラーコードは返されませんでした。

2
Raymond26

Xcode 6.2 Betaを使用していたときにiOS 7デバイスでエラーが発生しました。

Xcode 6.2 Betaから6.1.1に切り替えたことで、少なくともiOS 7デバイスでは問題が解決した。

2
Anton Tropashko

何ヶ月もの間問題を手に入れ、そして私達が私達のapiドメインでDNSSECを無効にするとき、すべてが大丈夫であることをついに発見しました:simple_smile:

1

NSURLRequestをNSURLSession リクエストのHTTPMethodを設定せずにに渡すと、このエラーが発生しました。

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

"エラードメイン= NSURLErrorDomain Code = -1005"ネットワーク接続が切断されました。 "

ただし、HTTPMethodを追加すると、接続は正常に機能します。

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

2017-01-25アップルはこのエラーに関する技術的なQ&Aをリリースしました:

アップルテクニカルQ&A QA1941

「ネットワーク接続が切断されました」エラーの処理

A:NSURLErrorNetworkConnectionLostは、NSURLErrorDomainエラードメインのエラー-1005で、「ネットワーク接続が切断されました」としてユーザーに表示されます。このエラーは、HTTPリクエストの進行中に、HTTPリクエストを伝送している基礎となるTCP接続が切断されたことを意味します(これについて詳しくは下記を参照)。状況によっては、NSURLSessionがそのような要求を自動的に再試行することがあります(特に、要求がべき等である場合)。ただし、HTTP標準では許可されていない状況もあります。

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

1
pkamb

私はVPN経由で接続していました。 VPNを無効にすると問題は解決しました。

1
alpere

他のアプリ(サファリなど)からリクエストできるかどうかをテストします。そうでない場合は、コンピュータに何か問題がある可能性があります。私の場合、私のシミュレータの要求をブロックしていたAvast Antivirusに問題がありました(なぜか聞かないでください)。

コンピュータを再起動するとXcode9.1の問題が解決しました。シミュレータとXcodeを再起動しましたが、動作しません。

1
young

問題がデバイスで発生している場合は、トラフィックがプロキシを通過しているかどうかを確認します([設定]> [Wi-Fi]>(情報)> [HTTPプロキシ])。私は自分のデバイスをCharlesと一緒に使うように設定しましたが、プロキシについて忘れました。 Charlesが実際に実行していないとこのエラーが発生するようです。

1
David James

私はこのエラーを受信して​​いて、またPostmanアプリケーションも落下していましたが、アプリケーションAdvanced Rest Client(ARC)で動作し、Androidで動作していたことに気付きました。それで私は通信をデバッグするためにCharlesをインストールしなければならなかった、そして私は応答コードが-1であることに気づく。問題は、RESTプログラマーが応答コード200を返すのを忘れたことです。

これが他の開発者に役立つことを願っています。

0
Tiago Mendes

私の場合は、HTTPに接続していて、HTTPSで実行していたためでした

0
luky

私は同じ問題に直面していました、私はアプリの遅いネットワークテストのためにNetwork Link Conditionerを有効にしました。それは私がSettings > Developer > Network Link Conditionerからそれを無効にしたとき、それは時々このエラーを作成していました、それは私の問題を解決しました。

enter image description here

これが誰かに役立つことを願っています。

0
Dhaval Bhimani

私の会社のサーバーを使用してiOS 12アプリから物理デバイスで電話をかけているときに同じ問題に直面しました。問題は、サーバーのハードディスクがいっぱいだったことです。サーバーの空き容量が問題を解決しました。

私は、タイムアウトがAppleによって提供されている標準のNetworking API(URLSession.timeoutIntervalForRequestおよびURLSession.timeoutIntervalForResource)を介してパラメータ化できないことが原因であると思う別の状況で同じエラーを見つけました。あっても..サーバーの回答が早く問題を解決しました

私は以下の理由でこの問題を抱えていました。

TLDR: NSURLRequest's HTTBodyプロパティではなくurlでパラメータを送信する必要があるGETリクエストを送信しているかどうかを確認します。

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

私は自分のアプリにネットワーク抽象化を実装していましたが、それはすべての要求に対して非常にうまく機能していました。

私は別のWebサービス(私のものではない)に新しいリクエストを追加しました、そしてそれは私にこのエラーを投げ始めました。

私は遊び場に行き、裸の要求を作り上げることからゼロから始めました、そして、それは働きました。そのため、原因が見つかるまで抽象化に近づきました。

私の抽象化実装はバグを持っていました:私はURLでエンコードされたパラメータを送ることになっていたリクエストを送っていました、そして私は同様にクエリパラメータでNSURLRequest's HTTBodyプロパティを満たしていました。 HTTPBodyを削除するとすぐにうまくいきました。

0
Nuno Gonçalves