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 を含むすべての接続に影響します。アプリ全体がビー玉を失っているようです。また、この直前に多数のバックグラウンド タスクがひどく終了しているのも見ますが、デバッガーでそれらをキャッチすることはできません。