283

iOS7 と iOS8 の両方で Xcode6-Beta1 と Xcode6-Beta2 で正常に動作するアプリケーションがあります。しかし、Xcode6-Beta3、Beta4、Beta5 では、iOS8 でネットワークの問題に直面していますが、iOS7 ではすべて正常に動作します。エラーが発生します"The network connection was lost."。エラーは次のとおりです。

エラー: エラー Domain=NSURLErrorDomain Code=-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ましたが、それでも同じエラーが発生します。

4

32 に答える 32

47

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

iOS シミュレーター -> コンテンツと設定をリセット -> リセットを押します (警告が表示されます)。

于 2014-10-29T06:54:36.817 に答える
29

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

この問題の影響を受ける場合は、http://bugreport.apple.comで追加の重複レーダーを提出して優先度を上げてください。

ネットワーク構成を変更せずにこの問題が発生した場合、それは既知のバグではなく、問題が既知のネットワーク構成変更バグではないことを示すレーダーを提出する必要があります。

于 2014-09-29T19:25:13.250 に答える
11

チャールズを開くと問題が解決しましたが、これは非常に奇妙に思えます...

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

于 2014-09-26T19:15:11.143 に答える
10

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

于 2015-02-03T09:29:13.803 に答える
10

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

お役に立てれば!

于 2016-04-19T19:29:54.793 に答える
6

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 リクエストを 2 回実行する

解決策: サイトへの接続を行う方法を使用して、(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;
     }

}
于 2015-03-29T18:16:02.817 に答える
3

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

于 2016-05-06T14:26:48.540 に答える
3

私も同じ問題を抱えていました。AFNetworking が https リクエストをどのように実装しているかはわかりませんが、理由は NSURLSession のキャッシュの問題です。

アプリケーションが safari から戻って追跡し、http 要求を送信すると、「http ロードに失敗しました 1005」というエラーが表示されます。の使用をやめ"[NSURLSession sharedSession]"、構成可能な NSURLSession インスタンスを使用して、次のように「dataTaskWithRequest:」メソッドを呼び出すと、問題は解決します。

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

設定することを忘れないでconfig.URLCache = nil;ください。

于 2018-05-14T01:56:16.610 に答える
2

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

Xcode 6.2 ベータ版から 6.1.1 に戻すと、少なくとも iOS 7 デバイスでは問題が修正されました。

于 2015-01-06T15:02:25.210 に答える
2

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

エラー -1005 を受け取るたびに再帰ブロックを実行することで問題を修正しました。これにより、接続が機能する前に再帰が 100 回以上ループすることがありますが、最終的には接続が確立されますが、実行にわずか 1 秒しか追加されません。それは、デバッガーが 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));、ブロックが再度呼び出されるようにするための呼び出しです。

于 2014-09-30T12:58:38.803 に答える
2

これを機能させるには、XCode を終了し、DerivedData フォルダーの内容 (~/Library/Developer/Xcode/DerivedData または /Library/Developer/Xcode/DerivedData) を削除し、シミュレーターを終了する必要がありました。

于 2014-09-23T08:29:44.237 に答える
1

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

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

エラー Domain=NSURLErrorDomain Code=-1005 「ネットワーク接続が失われました。」

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

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:urlComponents.URL];
[request setHTTPMethod:@"PUT"];
于 2016-03-05T00:20:00.317 に答える
1

エラー -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... 
       }
  }];

関数を再度呼び出すには、コードを追加する必要があります。メソッドを一度呼び出したことを確認してください。それ以外の場合は、再帰ループを呼び出します。

于 2018-04-03T07:00:46.093 に答える
1

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

于 2015-11-30T15:15:47.853 に答える
0

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

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

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

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

別の Web サービス (自分のものではない) に新しい要求を追加したところ、このエラーが発生し始めました。

私は遊び場に行き、ベアボーンリクエストをゼロから構築し始めましたが、うまくいきました。そのため、原因が見つかるまで抽象化に近づき始めました。

私の抽象化の実装にはバグがありました。URL にエンコードされたパラメーターを送信するはずのリクエストを送信していましたが、NSURLRequest's HTTBodyプロパティにもクエリパラメーターを入力していました。削除するHTTPBodyとすぐに機能しました。

于 2016-09-20T06:39:05.900 に答える
0

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

URLSession.timeoutIntervalForRequestApple が提供する標準の Networking API (および)を介してパラメーター化できないタイムアウトが原因であると思われる別の状況で、同じエラーが見つかりましたURLSession.timeoutIntervalForResource。それでも..サーバーの応答を高速化して問題を解決しました

于 2019-04-03T07:30:22.390 に答える
0

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

于 2017-11-08T06:18:03.763 に答える
0

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

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

于 2017-09-18T09:00:43.920 に答える