私は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
を試しましたが、それでも同じエラーが表示されます。
シミュレータを再起動すると問題が解決しました。
この正確なエラーがあり、NSURLRequest
の基礎となるHTTP実装の問題であることが判明しました。
私たちが知る限り、iOS 8/9/10/11はKeep-Alive
ヘッダーを含むHTTP応答を受信すると、この接続を保持し、後で再利用する必要がありますが、それ以上保持しますKeep-Aliveヘッダーのtimeout
パラメーターよりも(常に接続を30秒間有効に保つように思われます。)30秒以内にアプリから2番目のリクエストが送信されると、再利用を試みます。サーバーによってドロップされた可能性のある接続(実際のKeep-Alive
を超えた場合)。
これまでに見つかった解決策は次のとおりです。
KeepAliveTimeout
オプションを設定することで実行できます。BrowserMatch "iOS 8\." nokeepalive
setenvif.conf
)Connection: close
ヘッダーを使用してリクエストを送信してみてください。これにより、サーバーに接続をすぐに切断し、キープアライブヘッダーなしで応答するように指示します。ただし、現時点では、NSURLSessionは、リクエストが送信されるときにConnection
ヘッダーをオーバーライドするようです(Apacheの構成を微調整できるため、このソリューションを広範囲にテストしませんでした)私の場合は、SimulatorのResetting content and settings
が動作します。シミュレータをリセットするには、次の手順に従います。
iOSシミュレータ - >コンテンツと設定のリセット - >リセットが表示される
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行目を参照してください。
。
https
を使用するように変更すると、断続的なエラーがあってもiOS 8シミュレータからの接続が可能になります。
Xcode 6.01(gm)にはまだ問題があります。
私にとって問題を解決したのは、シミュレータを再起動し、内容と設定をリセットすることでした。
Charlesを開く /私のために問題を解決した、それは非常に奇妙に思える….
Charlesは、開発者が自分のマシンとインターネットの間のHTTPおよびSSL/HTTPSトラフィックをすべて表示できるようにするHTTPプロキシ/ HTTPモニター/リバースプロキシです。これには、リクエスト、レスポンス、およびHTTPヘッダー(Cookieとキャッシュ情報を含む)が含まれます。
Alamofireを使用している間、私はこの問題を経験していました。私の間違いは、GET
パラメータを送信するのではなく、nil
リクエストのパラメータに対して空の辞書[:]
を送信していたことです。
お役に立てれば!
方法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;
}
}
私は同じ問題を抱えていました。 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;
を設定することを忘れないでください。
私もこのエラーを受けていましたが、シミュレータではなく実際のデバイス上で。 HTTPS(gunicornサーバー)で私達のherokuバックエンドにアクセスした時、そして大きなボディ(64Kb以上のもの)でPOSTSをした時のエラーに気づきました。認証にHTTP基本認証を使用していますが、NSURLSessionでdidReceiveChallenge:
デリゲートメソッドを使用せずに、Authentiation: Basic <Base64Encoded UserName:Password>
を追加して認証を元の要求ヘッダーに焼き付けることでエラーが解決されたことに気付きました。これはdidReceiveChallenge:
デリゲートメッセージを引き起こすのに必要な401とそれに続くネットワーク接続が失われるのを防ぎます。
私は同じ問題を抱えていました。解決策は簡単で、HTTPBody
を設定しましたが、HTTPMethod
をPOST
に設定していません。これを修正した後、すべてが大丈夫だった。
XCodeを終了し、DerivedDataフォルダの内容(〜/ Library/Developer/Xcode/DerivedDataまたは/ Library/Developer/Xcode/DerivedData)を削除してシミュレータを終了する必要がありました。
私もこの問題を抱えていて、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));
を呼び出すことです。
バックエンドサーバーにファイルをアップロードしているときに誰かがこのエラーを受け取っている場合は、受信サーバーがあなたのメディアに許容される最大コンテンツサイズを持っていることを確認してください。私の場合、NGINXにはもっと高いclient_max_body_size
が必要でした。アップロードが完了する前にNGINXがリクエストを拒否したため、エラーコードは返されませんでした。
Xcode 6.2 Betaを使用していたときにiOS 7デバイスでエラーが発生しました。
Xcode 6.2 Betaから6.1.1に切り替えたことで、少なくともiOS 7デバイスでは問題が解決した。
何ヶ月もの間問題を手に入れ、そして私達が私達のapiドメインでDNSSECを無効にするとき、すべてが大丈夫であることをついに発見しました:simple_smile:
NSURLRequestをNSURLSession リクエストのHTTPMethodを設定せずにに渡すと、このエラーが発生しました。
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:urlComponents.URL];
"エラードメイン= NSURLErrorDomain Code = -1005"ネットワーク接続が切断されました。 "
ただし、HTTPMethod
を追加すると、接続は正常に機能します。
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:urlComponents.URL];
[request setHTTPMethod:@"PUT"];
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
私はVPN経由で接続していました。 VPNを無効にすると問題は解決しました。
他のアプリ(サファリなど)からリクエストできるかどうかをテストします。そうでない場合は、コンピュータに何か問題がある可能性があります。私の場合、私のシミュレータの要求をブロックしていたAvast Antivirusに問題がありました(なぜか聞かないでください)。
コンピュータを再起動するとXcode9.1の問題が解決しました。シミュレータとXcodeを再起動しましたが、動作しません。
問題がデバイスで発生している場合は、トラフィックがプロキシを通過しているかどうかを確認します([設定]> [Wi-Fi]>(情報)> [HTTPプロキシ])。私は自分のデバイスをCharlesと一緒に使うように設定しましたが、プロキシについて忘れました。 Charlesが実際に実行していないとこのエラーが発生するようです。
私はこのエラーを受信していて、またPostmanアプリケーションも落下していましたが、アプリケーションAdvanced Rest Client(ARC)で動作し、Androidで動作していたことに気付きました。それで私は通信をデバッグするためにCharlesをインストールしなければならなかった、そして私は応答コードが-1であることに気づく。問題は、RESTプログラマーが応答コード200を返すのを忘れたことです。
これが他の開発者に役立つことを願っています。
私の場合は、HTTPに接続していて、HTTPSで実行していたためでした
私の会社のサーバーを使用してiOS 12アプリから物理デバイスで電話をかけているときに同じ問題に直面しました。問題は、サーバーのハードディスクがいっぱいだったことです。サーバーの空き容量が問題を解決しました。
私は、タイムアウトがAppleによって提供されている標準のNetworking API(URLSession.timeoutIntervalForRequest
およびURLSession.timeoutIntervalForResource
)を介してパラメータ化できないことが原因であると思う別の状況で同じエラーを見つけました。あっても..サーバーの回答が早く問題を解決しました
私は以下の理由でこの問題を抱えていました。
TLDR: NSURLRequest's HTTBody
プロパティではなくurlでパラメータを送信する必要があるGET
リクエストを送信しているかどうかを確認します。
===================================================
私は自分のアプリにネットワーク抽象化を実装していましたが、それはすべての要求に対して非常にうまく機能していました。
私は別のWebサービス(私のものではない)に新しいリクエストを追加しました、そしてそれは私にこのエラーを投げ始めました。
私は遊び場に行き、裸の要求を作り上げることからゼロから始めました、そして、それは働きました。そのため、原因が見つかるまで抽象化に近づきました。
私の抽象化実装はバグを持っていました:私はURLでエンコードされたパラメータを送ることになっていたリクエストを送っていました、そして私は同様にクエリパラメータでNSURLRequest's HTTBody
プロパティを満たしていました。 HTTPBody
を削除するとすぐにうまくいきました。