NSURLSessionConfiguration
timeoutIntervalForRequest
请求超时时间,默认60s,任务在放弃之前应当等待的最大时间,每当有新数据包到达时,这个计时器会被重置
This is the timeout for each data in the session. The timer resets whenever the packet is transferred.
timeoutIntervalForResource
资源超时时间,默认7天,整个资源传输的最长时间,从请求开始时计时器开始计时,请求完成或到达最大间隔时,这个计时器会被重置
This is the timeout for the whole session. The total data transfer has to be completed within the timeout.
timeoutIntervalForResource 整个会话的最大时间
timeoutIntervalForRequest 两个数据包之间的最大间隔
NSURLSessionDelegate
- (void)URLSession:(NSURLSession *)session didBecomeInvalidWithError:(nullableNSError *)error;
会话变无效
- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * _Nullablecredential))completionHandler;
需要验证
- (void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session API_AVAILABLE(macos(11.0), ios(7.0), watchos(2.0), tvos(9.0));
后台session完成后的回调
NSURLSessionTaskDelegate
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
willBeginDelayedRequest:(NSURLRequest *)request
completionHandler:(void (^)(NSURLSessionDelayedRequestDisposition disposition, NSURLRequest * _NullablenewRequest))completionHandler
API_AVAILABLE(macos(10.13), ios(11.0), watchos(4.0), tvos(11.0));
ios11新增,配合earliestBeginDate使用,延迟调用时走这个代理,可以取消之前的请求或者重新发送一个新的请求或者沿用之前的请求
- (void)URLSession:(NSURLSession *)session taskIsWaitingForConnectivity:(NSURLSessionTask *)task
API_AVAILABLE(macos(10.13), ios(11.0), watchos(4.0), tvos(11.0));
只有waitsForConnectivity设置为YES,并且当前网络不可用是调用这个代理,注:backgroundsession模式下忽略这个代理
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
willPerformHTTPRedirection:(NSHTTPURLResponse *)response
newRequest:(NSURLRequest *)request
completionHandler:(void (^)(NSURLRequest * _Nullable))completionHandler;
请求http重定向
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge
completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * _Nullablecredential))completionHandler;
需要任务级别的验证
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
needNewBodyStream:(void (^)(NSInputStream * _Nullable bodyStream))completionHandler NS_SWIFT_ASYNC_NAME(urlSession(_:needNewBodyStreamForTask:));
这个任务需要新的数据流,设计数据流的请求验证失败时
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
didSendBodyData:(int64_t)bytesSent
totalBytesSent:(int64_t)totalBytesSent
totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend;
任务进度回调\
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didFinishCollectingMetrics:(NSURLSessionTaskMetrics *)metrics API_AVAILABLE(macosx(10.12), ios(10.0), watchos(3.0), tvos(10.0));
收集完统计信息
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
didCompleteWithError:(nullableNSError *)error;
任务完成的回调
NSURLSessionDataDelegate
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
didReceiveResponse:(NSURLResponse *)response
completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler;
已经接收到响应
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
didBecomeDownloadTask:(NSURLSessionDownloadTask *)downloadTask;
任务变成了下载任务
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
didBecomeStreamTask:(NSURLSessionStreamTask *)streamTask
API_AVAILABLE(macos(10.11), ios(9.0), watchos(2.0), tvos(9.0));
变成了流任务
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
didReceiveData:(NSData *)data;
收到了数据,可能是不连续的,使用[NSData enumerateByteRangesUsingBlock:]访问
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
willCacheResponse:(NSCachedURLResponse *)proposedResponse
completionHandler:(void (^)(NSCachedURLResponse * _Nullable cachedResponse))completionHandler;
询问委托数据(或上传)任务是否应将响应存储在缓存中。
会话在任务完成接收所有预期数据后调用此委托方法。如果未实现此方法,则默认行为是使用会话配置对象中指定的缓存策略。
此方法的主要目的是防止特定URL的缓存或修改与URL响应关联的userInfo字典。
只有在处理请求的NSURLProtocol决定缓存响应时才调用此方法。通常,只有满足以下所有条件时才会缓存响应:
1、请求是针对HTTP或HTTPS URL(或你自己的支持缓存的自定义网络协议)。
2、请求成功(状态码在200-299范围内)。
3、提供的响应来自服务器,而不是缓存。
4、会话配置的缓存策略允许缓存。
5、提供的NSURLRequest对象的缓存策略(如果适用)允许缓存。
6、服务器响应中的缓存相关头(如果存在)允许缓存。
7、响应大小足够小,可以合理地放入缓存中。 (例如,如果您提供磁盘缓存,则响应不得超过磁盘缓存大小的5%。)
注:如果委托实现此方法,则它必须调用completionHandler完成处理程序;否则,应用程序会泄漏内存。