次の問題があります。 NSMutableURLRequest
でHTTP
メソッドPOST
を使用すると、接続に設定されたタイムアウト間隔は無視されます。インターネット接続に問題がある場合(プロキシの誤り、DNSの誤り)、URL要求は約2〜4分後に失敗しますが、NSLocalizedDescription = "timed out";
NSUnderlyingError = Error Domain=kCFErrorDomainCFNetwork Code=-1001 UserInfo=0x139580 "The request timed out.
使用されるhttp
メソッドがGET
である場合、正常に機能します。接続はasync
よりもhttps
です。
NSURL *url = [NSURL URLWithString:urlString];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setTimeoutInterval:10];
//Set the request method to post
[request setHTTPMethod:@"POST"];
if (body != nil) {
[request setHTTPBody:body];
}
// Add general parameters to the request
if (authorization){
[request addValue: authorization forHTTPHeaderField:@"Authorization"];
}
[request addValue: WS_Host forHTTPHeaderField:@"Host"];
[request addValue:@"text/xml" forHTTPHeaderField:@"Content-Type"];
[[NSURLCache sharedURLCache] setDiskCapacity:0];
[self addToQueueRequest:request withDelegate:delegate];
'
Apple開発者フォーラムの投稿によると、POSTの最小タイムアウト間隔は240秒です。それより短いタイムアウト間隔は無視されます。
タイムアウト間隔を短くする必要がある場合は、非同期リクエストをタイマーとともに使用し、必要に応じてNSURLConnectionでキャンセルを呼び出します。
スレッドへのリンク: ここ
iOS 6ではこの問題が修正されています。
NSMutableURLRequest *request = [NSMutableURLRequest
requestWithURL:[NSURL URLWithString:url]
cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20];
[request setHTTPMethod:method];
[request setHTTPBody:requestBody];
NSLog(@"%f", [request timeoutInterval]);
//20.0 in iOS 6
//240.0 in iOS 4.3, 5.0, 5.1
Clay Chambersの提案で修正:カスタムタイマーを使用NSURLConnection
のサブクラスにタイマーを追加
if (needsSeparateTimeout){
SEL sel = @selector(customCancel);
NSMethodSignature* sig = [self methodSignatureForSelector:sel];
NSInvocation* invocation = [NSInvocation invocationWithMethodSignature:sig];
[invocation setTarget:self];
[invocation setSelector:sel];
NSTimer *timer = [NSTimer timerWithTimeInterval:WS_REQUEST_TIMEOUT_INTERVAL invocation:invocation repeats:NO];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
}
カスタムキャンセルメソッドでは、接続がキャンセルされます
[super cancel];
ここで説明されている問題はまだiOS 7.1に直面している(または再現された)ようです。幸い、NSURLSession
の設定で timeoutIntervalForResource プロパティを設定すると、これを修正できます。
[〜#〜]編集[〜#〜]
@XiOSの観測によると、これは(約)2分より短いタイムアウトで機能します。
あなたがタイムアウトエラーを処理する方法を意味する場合、私はまだこの質問に誰も答えていないと思います
その点を説明するために私のコードの一部を書きましょう
// replace "arg" with your argument you want send to your site
NSString * param = [NSString stringWithFormat:@"arg"];
NSData *Postdata = [param dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
NSString *postLength = [NSString stringWithFormat:@"%lu",(unsigned long)[Postdata length]];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc]init];
// replace "yoursite" with url of site you want post to
[request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"http//yoursite"]]];
// set what ever time you want in seconds 120 mean 2 min , 240 mean 4 min
[request setTimeoutInterval:120];
[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Current-Type"];
[request setHTTPBody:Postdata];
NSURLConnection * connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];
// if request time out without response from server error will occurred
-(void) connection:(NSURLConnection * ) connection didFailWithError:(NSError *)error {
if (error.code == NSURLErrorTimedOut)
// handle error as you want
NSLog(@"Request time out , Please try again later");
}
私はこれがタイムアウトエラーの処理方法を尋ねる助けになることを願っています