web-dev-qa-db-ja.com

NSMutableURLRequestのタイムアウト間隔は、POSTリクエストでは考慮されません。

次の問題があります。 NSMutableURLRequestHTTPメソッド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];

'
32
user177844

Apple開発者フォーラムの投稿によると、POSTの最小タイムアウト間隔は240秒です。それより短いタイムアウト間隔は無視されます。

タイムアウト間隔を短くする必要がある場合は、非同期リクエストをタイマーとともに使用し、必要に応じてNSURLConnectionでキャンセルを呼び出します。

スレッドへのリンク: ここ

28
user214852

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
27
freestyler

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];     
10
user177844

ここで説明されている問題はまだiOS 7.1に直面している(または再現された)ようです。幸い、NSURLSessionの設定で timeoutIntervalForResource プロパティを設定すると、これを修正できます。

[〜#〜]編集[〜#〜]

@XiOSの観測によると、これは(約)2分より短いタイムアウトで機能します。

3
Julian Król

あなたがタイムアウトエラーを処理する方法を意味する場合、私はまだこの質問に誰も答えていないと思います

その点を説明するために私のコードの一部を書きましょう

// 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");
}

私はこれがタイムアウトエラーの処理方法を尋ねる助けになることを願っています

0
Mina Fawzy