2

iOS 4.3+ で ASIHTTPRequest を使用して問題が発生しています。この問題では、リクエストは発行されますが、データ (リクエスト メソッド、URL、ヘッダーなど) がサーバーに到達しません。応答がないため、接続がタイムアウトします。

サーバーは空のリクエストを (少し遅れて) 受信し、有効なリクエストを受信します。もちろん、接続がタイムアウトしたため、上位レベルのコードには報告されません。リクエストがデータを再送信するように構成されていないため、これは奇妙なことです。

多くの場合、これは、アプリがしばらく (15 分以上) バックグラウンドにプッシュされ、電話がスリープ状態になった後に発生します。

リクエストの構成は次のとおりです。

NSMutableData *postData = nil;

NSString *urlString = [NSString stringWithFormat:@"%@%@",[self baseURL],requestPath];

OTSHTTPRequest *request = [OTSHTTPRequest requestWithURL:[NSURL URLWithString:urlString]];
[request setCachePolicy:ASIFallbackToCacheIfLoadFailsCachePolicy];
[request setTimeOutSeconds:45];
//Set up body
NSString *queryString = [self _RPcreateQueryString:query];
if ([queryString length]>0) {
    if(method == RPAsyncServerMethodPost || method == RPAsyncServerMethodPut){
        postData = [[[queryString dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES] mutableCopy] autorelease];
    }else{
        NSURL *url = [NSURL URLWithString:[urlString stringByAppendingFormat:@"?%@",queryString]];
        [request setURL:url];
        if (!url) return nil; //url String malformed.
    }
}

// ... ///
// method setting stripped for brevity

[request addRequestHeader:@"Content-Type" value:@"application/x-www-form-urlencoded"];

if(headers){
    for (NSString* head in headers) {
        if ([[headers valueForKey:head] isKindOfClass:[NSString class]]) 
            [request addRequestHeader:head value:[headers valueForKey:head]];
    }
}
[request addRequestHeader:@"Content-Length" value:postLength];
[request setPostBody:postData];

OTSHTTPRequest は ASIHTTPRequest の単なるサブクラスであり、文字列タグ、きれいな説明、およびオブジェクトを消費するために使用するその他のブリングのプロパティを含み、ASI のものをオーバーライドしません。

なぜ/どのようにASIが接続を開き、一度に数分間まったく何も送信しないのかを誰かが明らかにすることはできますか?

編集:明確にするために。接続はサーバーと通信しますが、サーバーログからわかるデータから、接続を介してデータを送信することはありません。これは、アプリの起動時に常に発生するようで、MapKit によって生成された NSURLConnections を含むすべての接続に影響します。アプリ全体がビー玉を失っているようです。また、この直前に多数のバックグラウンド タスクがひどく終了しているのも見ますが、デバッガーでそれらをキャッチすることはできません。

4

3 に答える 3

0

問題がなければ数日が経過するまで、私は何も言いたくありませんでした。この場合の解決策は非常にあいまいでした。

私が使用していた TestFlight のバージョンには、この問題の原因となった可能性のあるバグが含まれているようです。削除して以来、私はこの問題を経験していません。

于 2012-06-01T23:45:04.913 に答える
0

提供されたコードに基づいてリクエストを開始しているようには見えません。さまざまなプロパティの設定が完了したら、OTSHTTPRequest オブジェクトの -[startSynchronous] または -[startAsynchronous] メソッドを呼び出してみてください。

于 2012-05-29T18:46:38.173 に答える
0

デリゲートを設定していますか、私が見落としたか、削除しましたか。

于 2012-05-29T22:55:14.297 に答える