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.

image.png

timeoutIntervalForResource 整个会话的最大时间

timeoutIntervalForRequest 两个数据包之间的最大间隔

NSURLSessionDelegate

  • (void)URLSession:(NSURLSession )session didBecomeInvalidWithError:(nullableNSError )error;
    会话变无效

  • (void)URLSession:(NSURLSession )session didReceiveChallenge:(NSURLAuthenticationChallenge )challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *_Nullable credential))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
    _Nullable newRequest))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
    _Nullable credential))completionHandler;
    需要任务级别的验证

  • (void)URLSession:(NSURLSession )session task:(NSURLSessionTask )task
    needNewBodyStream:(void (^)(NSInputStream *_Nullable bodyStream))completionHandler NSSWIFT_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完成处理程序;否则,应用程序会泄漏内存。