gpt4 book ai didi

ios - NSURLSessionTask 在使用后台配置时从不在超时后回调

转载 作者:IT王子 更新时间:2023-10-29 08:05:35 28 4
gpt4 key购买 nike

我正在使用带有后台 session 的 NSURLSessionDownloadTask 来实现我所有的 REST 请求。这样我就可以使用相同的代码,而不必考虑我的应用程序是在后台还是在前台。

我的后端已经死了一段时间,我借此机会测试 NSURLSession 如何处理超时。

令我非常惊讶的是,我的 NSURLSessionTaskDelegate 回调都没有被调用。无论我在 NSURLRequestNSURLSessionConfiguration 上设置什么超时,我都不会从 iOS 收到任何回调,告诉我请求确实已超时完成。

也就是说,当我在后台 session 中启动 NSURLSessionDownloadTask 时。应用程序在后台或前台发生相同的行为。

示例代码:

- (void)launchDownloadTaskOnBackgroundSession {
NSString *sessionIdentifier = @"com.mydomain.myapp.mySessionIdentifier";
NSURLSessionConfiguration *backgroundSessionConfiguration = [NSURLSessionConfiguration backgroundSessionConfiguration:sessionIdentifier];
backgroundSessionConfiguration.requestCachePolicy = NSURLRequestReloadIgnoringCacheData;
backgroundSessionConfiguration.timeoutIntervalForRequest = 40;
backgroundSessionConfiguration.timeoutIntervalForResource = 65;
NSURLSession *backgroundSession = [NSURLSession sessionWithConfiguration:backgroundSessionConfiguration delegate:self delegateQueue:[NSOperationQueue mainQueue]];

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.timeout.com/"]];
request.timeoutInterval = 30;
NSURLSessionDownloadTask *task = [backgroundSession downloadTaskWithRequest:request];
[task resume];
}

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
NSLog(@"URLSession:task:didCompleteWithError: id=%d, error=%@", task.taskIdentifier, error);
}

但是,当我使用默认 session 时,我会在 30 秒(我在请求级别设置的超时)后收到错误回调。

示例代码:

- (void)launchDownloadTaskOnDefaultSession {
NSURLSessionConfiguration *defaultSessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
defaultSessionConfiguration.requestCachePolicy = NSURLRequestReloadIgnoringCacheData;
defaultSessionConfiguration.timeoutIntervalForRequest = 40;
defaultSessionConfiguration.timeoutIntervalForResource = 65;
NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration:defaultSessionConfiguration delegate:self delegateQueue:[NSOperationQueue mainQueue]];

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.timeout.com/"]];
request.timeoutInterval = 30;
NSURLSessionDownloadTask *task = [defaultSession downloadTaskWithRequest:request];
[task resume];
}

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
NSLog(@"URLSession:task:didCompleteWithError: id=%d, error=%@", task.taskIdentifier, error);
}

我似乎无法在文档中找到任何表明在使用后台 session 时超时应该有不同行为的内容。

有没有人也遇到过这个问题?这是错误还是功能?

我正在考虑创建错误报告,但我通常在 SO(几分钟)上比在错误报告器(六个月)上更快地获得反馈。

问候,

最佳答案

从iOS8开始,后台模式的NSUrlSession在服务器没有响应的情况下不会调用这个delegate方法。-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
下载/上传无限期地保持空闲。当服务器没有响应时,在 iOS7 上调用此委托(delegate)会出错。

In general, an NSURLSession background session does not fail a task if something goes wrong on the wire. Rather, it continues looking for a good time to run the request and retries at that time. This continues until the resource timeout expires (that is, the value of the timeoutIntervalForResource property in the NSURLSessionConfiguration object you use to create the session). The current default for that value is one week!

Quoted information taken from this Source

换句话说,在 iOS7 中超时失败的行为是不正确的。在后台 session 的上下文中,更有趣的是不要因为网络问题而立即失败。所以从 iOS8 开始,NSURLSession 任务即使遇到超时和网络丢失也会继续。然而,它会继续,直到达到 timeoutIntervalForResource。

所以基本上 timeoutIntervalForRequest 不会在后台 session 中工作,但 timeoutIntervalForResource 会。

关于ios - NSURLSessionTask 在使用后台配置时从不在超时后回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23288780/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com