32

次の問題があります。メソッドをNSMutableURLRequest使用すると、接続に設定されたタイムアウト間隔は無視されます。インターネット接続に問題がある場合 (プロキシが間違っている、DNS が正しくない)、URL 要求は約 2 ~ 4 分後に失敗しますが、 HTTPPOSTNSLocalizedDescription = "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];

'
4

5 に答える 5

28

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

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

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

于 2009-11-19T18:36:17.647 に答える
27

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
于 2012-10-15T17:45:48.783 に答える
10

Clay Chambers の提案で修正: with a custom timer のサブクラスにタイマーを追加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];     
于 2010-05-14T15:13:58.430 に答える
3

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

編集

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

于 2014-10-29T09:56:54.430 に答える