NSMutableURLRequest setTimeoutInterval 在 ios 11.0 中不起作用

Posted

技术标签:

【中文标题】NSMutableURLRequest setTimeoutInterval 在 ios 11.0 中不起作用【英文标题】:NSMutableURLRequest setTimeoutInterval not working in ios 11.0 【发布时间】:2017-11-23 08:00:41 【问题描述】:

我正在使用 URL 后台会话将 pdf 作为数据流上传,使用 ios 版本 > 9.0。我将超时间隔设置为 300 秒。它根本不工作。 10 秒后出现超时错误。

下面给出一段代码

  NSTimeInterval reqTimeInterval = 300.0f;

- (NSURLSession *)uploadSessionForMrNo:(NSString *)mrNo
                            userRoleId:(NSString *)userRoleId
                             timestamp:(NSString *)timestamp 

    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    queue.maxConcurrentOperationCount = 4;

    NSString *backgroundSessionIdentifier = [NSString stringWithFormat:@"backgroundPdfUploadIdentifier_%@",mrNo];

    NSURLSessionConfiguration *backgroundSession = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:backgroundSessionIdentifier];
    backgroundSession.discretionary = true;

    NSURLSession *session = [NSURLSession sessionWithConfiguration:backgroundSession delegate:self delegateQueue:queue];

    [session setAccessibilityLabel:mrNo];
    [session setAccessibilityValue:userRoleId];
    [session setAccessibilityHint:timestamp];

    return session;



- (void)uploadPdfRequest:(NSURLRequest *)request
                 forMrNo:(NSString *)mrNo
              userRoleId:(NSString *)userRoleId
             andTimestamp:(NSString *)timestamp 

    NSURLSession *session = [self uploadSessionForMrNo:mrNo userRoleId:userRoleId timestamp:timestamp];
    NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request];
    NSLog(@"postDataTask %@ timeout %f",postDataTask,request.timeoutInterval);
    [postDataTask resume];

请求上传数据流。

NSMutableURLRequest *request = [[NSURLRequest requestForPDFStringUpload:uploadQueue.uploadData] mutableCopy];
[request setValue:[DataExchange authToken] forHTTPHeaderField:FBENCRYPT_TOKEN_KEY];
[request setCachePolicy:NSURLRequestUseProtocolCachePolicy];
[request setTimeoutInterval:reqTimeInterval];
[self uploadPdfRequest:request forMrNo:uploadQueue.mrNo userRoleId:uploadQueue.userRoleId andTimestamp:uploadQueue.timestamp];

委托

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
didCompleteWithError:(NSError *)error 

    if (error) 
        // Handle error
        NSLog(@"Error %@",error);
    

    [session finishTasksAndInvalidate];
    self.receivedData = nil;

如果互联网工作正常,则正常,否则 10 秒后我得到

Error Error Domain=NSURLErrorDomain Code=-1001 "请求超时。" UserInfo=NSErrorFailingURLStringKey=http://test.mydomain.com/common.svc/json/FileUploadPDF, NSErrorFailingURLKey=http://test.mydomain.com/common.svc/json/FileUploadPDF, _kCFStreamErrorDomainKey=4, _kCFStreamErrorCodeKey=-2104, NSLocalizedDescription=请求超时。

有关此问题的更多详细信息,

我在 ios 9.3 模拟器 中检查了我的代码,它等待连接出现。然后继续上传。我已经检查了它等待它工作的 4 分钟。但是当我将此代码运行到 ios 11.0.1 时,它会在 10 秒后超时。我应该做些什么来实现它。我也试过了

if ([backgroundSession respondsToSelector:@selector(setWaitsForConnectivity:)]) 
    [backgroundSession setWaitsForConnectivity:true];

但它没有效果。


您可以使用下面的演示文件:-

ViewController.h & .m

【问题讨论】:

您可以将超时直接传递给您的会话配置,例如session.timeoutIntervalForRequest = 30.0; session.timeoutIntervalForResource = 60.0; 看到这个***.com/a/23428960/4601900 已经尝试过 backgroundSession.timeoutIntervalForRequest = 300.0f; backgroundSession.timeoutIntervalForResource = 300.0f; 根据我的想法超时与互联网连接不可用没有任何关系,因为超时应该只在互联网正常工作并且平均时间请求无法完成时才有效!! 您可以检查可率性,在连接丢失事件中,您可以使用恢复数据暂停您的请求,并在一切正常时重新开始 【参考方案1】:

@Warewolf 我已经下载了你的 .m 文件并集成到我的演示项目中。

似乎在 Xcode 9.1 和 iOS 11.1 中都能正常工作

我可以在几秒钟内得到回复..

下面是你的代码输出..

response of background session --- 
    RestResponse =     
        messages =         (
            "Total [249] records found."
        );
        result =         (
                        
                "alpha2_code" = AF;
                "alpha3_code" = AFG;
                name = Afghanistan;
            ,
                        
                "alpha2_code" = AX;
                "alpha3_code" = ALA;
                name = "\Ufffd\Ufffdland Islands";
            ,
                        
                "alpha2_code" = AL;
                "alpha3_code" = ALB;
                name = Albania;
            ,.....

【讨论】:

@Warewolf 我设置了NSTimeInterval reqTimeInterval = 10.0f; 然后它的工作和输出。 我也能在几秒钟内得到回复,可能你还没有理解我的问题。关闭您的网络连接,然后点击 API。我的问题是为什么它不等待超过 10 秒。 我已关闭网络连接,然后点击 api。即使我给了 30 秒,默认情况下也需要 60 秒。 你正在尝试哪个 ios? 让我们continue this discussion in chat。【参考方案2】:

我认为你应该将 backgroundSession.timeoutIntervalForResource 的值设置为大于 reqTimeInterval。

NSURLSessionConfiguration *backgroundSession = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:backgroundSessionIdentifier];
backgroundSession.timeoutIntervalForRequest = reqTimeInterval;
backgroundSession.timeoutIntervalForResource = reqTimeInterval;

希望这会对你有所帮助。

【讨论】:

我已经尽我所能,包括您的建议,如果您有 ios 11.0,请通过关闭网络连接对其进行测试。【参考方案3】:

为 backgroundSession 设置 timeoutIntervalForRequest 属性。

【讨论】:

检查 Agula Otgonbaatar 的答案,有什么不同吗?【参考方案4】:

案例 1:可能有助于我调用本地服务器连接并收到此错误。我在我的设备和手机中使用不同的网络。当我将两者都连接到同一个 wifi 时,它起作用了。

案例 2:我收到 Code=-1001 “请求超时。”的错误。我尝试了几件事。没有任何效果。最后我发现问题出在我在请求正文中发送到服务器的参数中,这些参数格式错误(值很好,但类型错误)。这就是请求超时的原因,因为服务器无法处理它。如果没有其他方法适合你,你可以检查一下。

如果您还没有解决上述问题,请尝试使用名为 [NSURLConnection sendAsynchronousRequest:queue:completionHandler: 的 GCD 抽象

【讨论】:

以上是关于NSMutableURLRequest setTimeoutInterval 在 ios 11.0 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AFNetworking 向现有 NSMutableURLRequest 添加参数?

NSMutableURLRequest 发送部分帖子正文

NSMutableURLRequest 的问题

NSMutableURLRequest 在使用 NSURLSession 时发送 2 次

POST 请求未考虑 NSMutableURLRequest 超时间隔

如何在注销期间取消所有 NSMutableURLRequest?