2012-02-20 21 views
3

URLからデータを取得しようとしていますが、何らかの理由で次の操作を行っても何も起こりません。どちらdidReceiveResponse:didReceiveData:didFailWithError:またはconnectionDidFinishLoading:が、私はこれを行うことによって、私の要求にタイムアウトを追加する場合を除き、到達されていますNSURLConnection not responding

-(void)getConfigFromServer{ 
    [self getContentAtURL:kUrlGetUser]; 
} 

//Va chercher le contenu à l'URL passée en paramètre 
- (void)getContentAtURL: (NSURL *)url { 

    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; 

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
    NSString * userLogin = [userDefaults objectForKey:@"UserLogin"]; 
    NSString * userPassword = [userDefaults objectForKey:@"UserPassword"]; 
    NSURL * urlFinal = [NSURL URLWithString:[NSString stringWithFormat:@"%@", url]]; 
    NSLog(@"Request : %@", [NSString stringWithFormat:@"%@", url]); 
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
    [request setURL:urlFinal]; 
    [request setHTTPShouldHandleCookies:NO]; 
    [request setTimeoutInterval:10.0]; 

    NSString *sourceString = [NSString stringWithFormat:@"%@:%@", userLogin, userPassword]; 
    NSData * sourceData = [sourceString dataUsingEncoding:NSUTF8StringEncoding]; 
    NSString *authString = [sourceData base64EncodedString]; 

    authString = [NSString stringWithFormat: @"Basic %@", authString]; 
    [request setValue:authString forHTTPHeaderField:@"Authorization"]; 
    [request setValue:@"text/xml" forHTTPHeaderField:@"Accept"]; 
    NSURLConnection * connection=[NSURLConnection connectionWithRequest:request delegate:self]; 

    if(connection){ 
     NSLog(@"Connection started"); 
     receivedData = [NSMutableData data]; 
    }else{ 
     NSLog(@"Error while trying to initiate the connection"); 
    } 
} 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
    [receivedData setLength:0]; 
    if ([response respondsToSelector:@selector(statusCode)]) 
    { 
     int statusCode = [((NSHTTPURLResponse *)response) statusCode]; 
     if (statusCode >= 400) 
     { 
      [connection cancel]; // stop connecting; no more delegate messages 
      NSDictionary *errorInfo 
       = [NSDictionary dictionaryWithObject:[NSString stringWithFormat: 
       NSLocalizedString(@"Server returned status code %d",@""), 
       statusCode] 
        forKey:NSLocalizedDescriptionKey]; 
      NSError *statusError = [NSError errorWithDomain:@"Error" 
       code:statusCode 
       userInfo:errorInfo]; 
      [self connection:connection didFailWithError:statusError]; 
     } 
    } 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ 
    [receivedData appendData:data]; 
} 

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{ 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
    NSLog(@"Connection failed! Error - %@ %@",[error localizedDescription],[[error userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey]); 
} 

-(void)connectionDidFinishLoading:(NSURLConnection *)connection{ 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
    [self fetchedData:receivedData]; 
} 

EDIT:私はまだ持ってるの[request setTimeoutInterval:10.0]

は、ここで私がやってんですよこの問題は、今実際のデバイスにもあります。私がコメントで言ったように、私はこのアプリでARCをはじめて使用し、XCode 4.2を使用しています。

+0

サーバーはオンラインですか? – 0xSina

+1

タイムアウトを設定すると、何が呼び出されますか?リクエストがロードされるか、失敗するか?後者の場合は、エラーテキストを教えてください。デフォルトのタイムアウトは60秒です。障害メソッドが呼び出されるまで待つだけの十分な時間を確保してください。 – coverback

+0

はい、サーバーはオンラインです。多くのURLを試して、問題ではないことを確認してください。 タイムアウトを設定すると、次のように表示されます。 '接続に失敗しました!エラー - 要求がタイムアウトしました。 URLに続いて。 – ChrisTauziet

答えて

0

あなたのgetContentAtURLにNSURLを渡したが、それは文字列だったかのようにそれを処理している:ところで、あなたは」あなたを知って

NSURL * urlFinal = [NSURL URLWithString:[NSString stringWithFormat:@"%@", [url absoluteString]]]; 

:それを変更してみてください

NSURL * urlFinal = [NSURL URLWithString:[NSString stringWithFormat:@"%@", url]]; 

あなたのログインとパスワードを使用していないのですか?

EDIT:

あなたはreceivedData = [NSMutableDataデータ]を言います。データとは何ですか?

問題だと思います。

私は、データが最初に到着したときの設定にデータオブジェクトを次のように使用する傾向がある:

- (void)connection:(NSURLConnection *)theConnection didReceiveData:(NSData *)incrementalData { 
    if (receivedData ==nil) { receivedData = [[NSMutableData alloc] initWithCapacity:2048]; } 
    [receivedData appendData:incrementalData]; 
} 
+0

よろしくお願いいたします。私はこれをしましたが、何も変わっていません:( はい、私は認証にいくつかのログイン/パスワードを使用しています。なぜですか? – ChrisTauziet

+0

はこれがシミュレータまたはデバイスにありますか? – ader

+0

シミュレータ内。 – ChrisTauziet

0

私は、問題はサーバ側でになると思います。 TimeoutIntervalを60に増やして、サーバーからデータを取得する時間が長くなるようにしてください。 10秒後に "connection timed out"というメッセージが表示されませんでしたか?

EDIT

こんにちは、私はまだあなたが解決策に到達していないと思います。コードを詳細に読むと、いくつかのステートメントが混乱していることがわかりました。

1)[request setValue:@"text/xml" forHTTPHeaderField:@"Accept"];また

[request setValue:@"text/plain" forHTTPHeaderField:@"Content-Type"]; 

そして最後に...

エラー "接続がタイムアウトは、" iPhoneはいずれも受けていないことを示し、含ま

[request setValue:@"text/plain" forHTTPHeaderField:@"Accept"]; 

と交換サーバーからのデータ。 iPhoneがデータを取得するとすぐに、- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)dataが呼び出されます。各ステートメントの後にNSLogを入れて、変数が目的の値を保持していることを確認してください。送信前にデータの長さを確認してください - sourceData -

+1

ローカルのURLにアクセスしようとしています。私は60秒のTimeoutIntervalで試しましたが、どちらもうまくいきません。 Safariを使用して同じURLにアクセスしようとすると、正常に動作します。 面白いことは、時にはうまくいくということです。私は問題がシミュレータか何かから来ていないのだろうかと思っています。 – ChrisTauziet

+0

私はクリスと同じ問題を、非常にイライラする。 – Vamos

0

エラーメッセージは、あなたがコメントで述べたように、要求がタイムアウトしたと言っています。 タイムアウトのある回線を削除すると、60秒後に同じ応答または実際のデータが得られることは確かです。何らかの理由で接続が非常に弱い場合、データのダウンロードを続けるため、要求が60秒後にタイムアウトしない可能性があるため、十分に待ってください。

これを起動している最中にアプリがフォアグラウンドになっていますか?それを中断しないようにしてください。

さらに、サーバーはオンラインだと言いますが、コードがタイムアウトしています。結局のところ、あなたの接続に何かが間違っている可能性があります。

別のコメントでは、時にはそれが動作すると言います。さらに、接続が弱い/信頼できない、または切断されていることを指摘します。

+0

私の記事で言いましたように、私はタイムアウトを使用していません。私は、デリゲートメソッドが呼び出されたかどうかを確認しようとしました。タイムアウトを解除したり、60秒に設定しても、何も得られません。 私はシミュレータを使用しており、Safariを使用して1秒以内に到達できるローカルサーバに到達しようとしています。 google.comや他のウェブサイトにアクセスしようとすると同じです。そして、はい、私のアプリは前景にあります。 – ChrisTauziet

0

ここにいくつかの考え:

  1. くださいが(多分あなたは唯一の私は、これは言及していたかった、テストしている)、そのためにキーチェーンを使用し、UserDefaultsではないストアのパスワードを行う
  2. なぜあなたはNSURL URLを新しいNSURLに変換するには、stringWithFormat:をURLに送信しますか? (ああ、私は既に@adeがそれを言及しているのを見て)
  3. これはですか?ARC対応アプリですか?そうでない場合、NSMutableDataはすぐに自動リリースされ、self.receivedData = [NSMutableData data]を使用するとクラッシュすることがあります。
  4. NSURLConnectionをインスタンス変数にして、それを保持してください。私はそれがあなたが今やっているやり方ではうまくいくはずだと思うが、私はそれを保持しがちで、あなたがここで言及した問題は決してなかった。
  5. あなたの10秒のタイムアウトがうまくいっているように見えますが、これを動作させるのに問題があり、iPhoneでタイムアウトが240秒より遅くなることはありません。はい、私はこれについても混乱していましたが、:https://stackoverflow.com/a/3611383/148335
+0

1.私のテストのためだけです。しかし、これまでキーチェーンは使用していません。あなたはそのための良い勧告をお持ちですか? 2.ええ、私は知っている、愚か:) 3.はい、ARC対応 4.試してみてください。それも修正しないでください。 – ChrisTauziet

+0

@ChrisTauzietアップルの方法でのみ扱うキーチェーンは苦痛です.SHHFKeychainUtilsをチェックしてください:https://github.com/ldandersen/scifihifi-iphone/tree/master/security – Pascal

5

これは古いスレッドですが、まだこの回答は誰かを助けるかもしれません。

これをバックグラウンドスレッドで呼び出す場合は、デリゲートが呼び出される前にスレッドが終了しているかどうかを確認してください。

これを試してください。

NSURLConnection * connection = [[NSURLConnection alloc] 
           initWithRequest:request 
             delegate:self startImmediately:NO]; 

[connection scheduleInRunLoop:[NSRunLoop mainRunLoop] 
         forMode:NSDefaultRunLoopMode]; 
[connection start]; 
+0

感謝します@スリランカ!私は正常に要求を発射したが、何も返さないNSURLConnectionを持っていた。私がやらなければならなかったのはstartImmediately:NOと[scheduleInRunLoop:forMode:]を追加して修正することでした。 –

+1

できれば私はあなたに+100を与えるだろう! – Tokuriku

関連する問題