NSMutableURLRequest setTimeoutInterval在ios 11.0中不起作用

War*_*olf 8 objective-c nsurlsession nsurlsessiondatatask ios11

我正在使用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];
}
Run Code Online (Sandbox Code Playgroud)

请求上传数据流.

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];
Run Code Online (Sandbox Code Playgroud)

代表

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

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

    [session finishTasksAndInvalidate];
    self.receivedData = nil;
}
Run Code Online (Sandbox Code Playgroud)

如果互联网工作正常,那么它的罚款,否则10秒后,我得到

错误错误域= NSURLErrorDomain代码= -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];
}
Run Code Online (Sandbox Code Playgroud)

但它没有效果.


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

ViewController.h&.m

小智 0

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

NSURLSessionConfiguration *backgroundSession = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:backgroundSessionIdentifier];
backgroundSession.timeoutIntervalForRequest = reqTimeInterval;
backgroundSession.timeoutIntervalForResource = reqTimeInterval;
Run Code Online (Sandbox Code Playgroud)

希望对你有帮助。