lpw
2022-07-12 c77203090e0536c3e51b891cb455a4f53464f819
commit | author | age
6e1425 1 // AFURLSessionManager.h
633752 2 // Copyright (c) 2011–2016 Alamofire Software Foundation ( http://alamofire.org/ )
6e1425 3 //
H 4 // Permission is hereby granted, free of charge, to any person obtaining a copy
5 // of this software and associated documentation files (the "Software"), to deal
6 // in the Software without restriction, including without limitation the rights
7 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 // copies of the Software, and to permit persons to whom the Software is
9 // furnished to do so, subject to the following conditions:
10 //
11 // The above copyright notice and this permission notice shall be included in
12 // all copies or substantial portions of the Software.
13 //
14 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 // THE SOFTWARE.
21
633752 22
6e1425 23 #import <Foundation/Foundation.h>
H 24
25 #import "AFURLResponseSerialization.h"
26 #import "AFURLRequestSerialization.h"
27 #import "AFSecurityPolicy.h"
633752 28 #import "AFCompatibilityMacros.h"
6e1425 29 #if !TARGET_OS_WATCH
H 30 #import "AFNetworkReachabilityManager.h"
31 #endif
32
33 /**
34  `AFURLSessionManager` creates and manages an `NSURLSession` object based on a specified `NSURLSessionConfiguration` object, which conforms to `<NSURLSessionTaskDelegate>`, `<NSURLSessionDataDelegate>`, `<NSURLSessionDownloadDelegate>`, and `<NSURLSessionDelegate>`.
35
36  ## Subclassing Notes
37
38  This is the base class for `AFHTTPSessionManager`, which adds functionality specific to making HTTP requests. If you are looking to extend `AFURLSessionManager` specifically for HTTP, consider subclassing `AFHTTPSessionManager` instead.
39
40  ## NSURLSession & NSURLSessionTask Delegate Methods
41
42  `AFURLSessionManager` implements the following delegate methods:
43
44  ### `NSURLSessionDelegate`
45
46  - `URLSession:didBecomeInvalidWithError:`
47  - `URLSession:didReceiveChallenge:completionHandler:`
48  - `URLSessionDidFinishEventsForBackgroundURLSession:`
49
50  ### `NSURLSessionTaskDelegate`
51
52  - `URLSession:willPerformHTTPRedirection:newRequest:completionHandler:`
53  - `URLSession:task:didReceiveChallenge:completionHandler:`
54  - `URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:`
633752 55  - `URLSession:task:needNewBodyStream:`
6e1425 56  - `URLSession:task:didCompleteWithError:`
H 57
58  ### `NSURLSessionDataDelegate`
59
60  - `URLSession:dataTask:didReceiveResponse:completionHandler:`
61  - `URLSession:dataTask:didBecomeDownloadTask:`
62  - `URLSession:dataTask:didReceiveData:`
63  - `URLSession:dataTask:willCacheResponse:completionHandler:`
64
65  ### `NSURLSessionDownloadDelegate`
66
67  - `URLSession:downloadTask:didFinishDownloadingToURL:`
bf3f86 68  - `URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:`
6e1425 69  - `URLSession:downloadTask:didResumeAtOffset:expectedTotalBytes:`
H 70
71  If any of these methods are overridden in a subclass, they _must_ call the `super` implementation first.
72
73  ## Network Reachability Monitoring
74
75  Network reachability status and change monitoring is available through the `reachabilityManager` property. Applications may choose to monitor network reachability conditions in order to prevent or suspend any outbound requests. See `AFNetworkReachabilityManager` for more details.
76
77  ## NSCoding Caveats
78
79  - Encoded managers do not include any block properties. Be sure to set delegate callback blocks when using `-initWithCoder:` or `NSKeyedUnarchiver`.
80
81  ## NSCopying Caveats
82
83  - `-copy` and `-copyWithZone:` return a new manager with a new `NSURLSession` created from the configuration of the original.
84  - Operation copies do not include any delegate callback blocks, as they often strongly captures a reference to `self`, which would otherwise have the unintuitive side-effect of pointing to the _original_ session manager when copied.
85
86  @warning Managers for background sessions must be owned for the duration of their use. This can be accomplished by creating an application-wide or shared singleton instance.
87  */
88
89 NS_ASSUME_NONNULL_BEGIN
90
91 @interface AFURLSessionManager : NSObject <NSURLSessionDelegate, NSURLSessionTaskDelegate, NSURLSessionDataDelegate, NSURLSessionDownloadDelegate, NSSecureCoding, NSCopying>
92
93 /**
94  The managed session.
95  */
96 @property (readonly, nonatomic, strong) NSURLSession *session;
97
98 /**
99  The operation queue on which delegate callbacks are run.
100  */
101 @property (readonly, nonatomic, strong) NSOperationQueue *operationQueue;
102
103 /**
104  Responses sent from the server in data tasks created with `dataTaskWithRequest:success:failure:` and run using the `GET` / `POST` / et al. convenience methods are automatically validated and serialized by the response serializer. By default, this property is set to an instance of `AFJSONResponseSerializer`.
105
106  @warning `responseSerializer` must not be `nil`.
107  */
108 @property (nonatomic, strong) id <AFURLResponseSerialization> responseSerializer;
109
110 ///-------------------------------
111 /// @name Managing Security Policy
112 ///-------------------------------
113
114 /**
633752 115  The security policy used by created session to evaluate server trust for secure connections. `AFURLSessionManager` uses the `defaultPolicy` unless otherwise specified.
6e1425 116  */
H 117 @property (nonatomic, strong) AFSecurityPolicy *securityPolicy;
118
119 #if !TARGET_OS_WATCH
120 ///--------------------------------------
121 /// @name Monitoring Network Reachability
122 ///--------------------------------------
123
124 /**
125  The network reachability manager. `AFURLSessionManager` uses the `sharedManager` by default.
126  */
127 @property (readwrite, nonatomic, strong) AFNetworkReachabilityManager *reachabilityManager;
128 #endif
129
130 ///----------------------------
131 /// @name Getting Session Tasks
132 ///----------------------------
133
134 /**
135  The data, upload, and download tasks currently run by the managed session.
136  */
633752 137 @property (readonly, nonatomic, strong) NSArray <NSURLSessionTask *> *tasks;
6e1425 138
H 139 /**
140  The data tasks currently run by the managed session.
141  */
633752 142 @property (readonly, nonatomic, strong) NSArray <NSURLSessionDataTask *> *dataTasks;
6e1425 143
H 144 /**
145  The upload tasks currently run by the managed session.
146  */
633752 147 @property (readonly, nonatomic, strong) NSArray <NSURLSessionUploadTask *> *uploadTasks;
6e1425 148
H 149 /**
150  The download tasks currently run by the managed session.
151  */
633752 152 @property (readonly, nonatomic, strong) NSArray <NSURLSessionDownloadTask *> *downloadTasks;
6e1425 153
H 154 ///-------------------------------
155 /// @name Managing Callback Queues
156 ///-------------------------------
157
158 /**
159  The dispatch queue for `completionBlock`. If `NULL` (default), the main queue is used.
160  */
161 @property (nonatomic, strong, nullable) dispatch_queue_t completionQueue;
162
163 /**
164  The dispatch group for `completionBlock`. If `NULL` (default), a private dispatch group is used.
165  */
166 @property (nonatomic, strong, nullable) dispatch_group_t completionGroup;
167
168 ///---------------------
169 /// @name Initialization
170 ///---------------------
171
172 /**
173  Creates and returns a manager for a session created with the specified configuration. This is the designated initializer.
174
175  @param configuration The configuration used to create the managed session.
176
177  @return A manager for a newly-created session.
178  */
179 - (instancetype)initWithSessionConfiguration:(nullable NSURLSessionConfiguration *)configuration NS_DESIGNATED_INITIALIZER;
180
181 /**
633752 182  Invalidates the managed session, optionally canceling pending tasks and optionally resets given session.
L 183  
184  @param cancelPendingTasks  Whether or not to cancel pending tasks.
185  @param resetSession        Whether or not to reset the session of the manager.
186  */
187 - (void)invalidateSessionCancelingTasks:(BOOL)cancelPendingTasks resetSession:(BOOL)resetSession;
6e1425 188
H 189 ///-------------------------
190 /// @name Running Data Tasks
191 ///-------------------------
633752 192
L 193 /**
194  Creates an `NSURLSessionDataTask` with the specified request.
195
196  @param request The HTTP request for the request.
197  @param uploadProgressBlock A block object to be executed when the upload progress is updated. Note this block is called on the session queue, not the main queue.
198  @param downloadProgressBlock A block object to be executed when the download progress is updated. Note this block is called on the session queue, not the main queue.
199  @param completionHandler A block object to be executed when the task finishes. This block has no return value and takes three arguments: the server response, the response object created by that serializer, and the error that occurred, if any.
200  */
201 - (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request
202                                uploadProgress:(nullable void (^)(NSProgress *uploadProgress))uploadProgressBlock
203                              downloadProgress:(nullable void (^)(NSProgress *downloadProgress))downloadProgressBlock
204                             completionHandler:(nullable void (^)(NSURLResponse *response, id _Nullable responseObject,  NSError * _Nullable error))completionHandler;
6e1425 205
H 206 ///---------------------------
207 /// @name Running Upload Tasks
208 ///---------------------------
209
210 /**
211  Creates an `NSURLSessionUploadTask` with the specified request for a local file.
212
213  @param request The HTTP request for the request.
214  @param fileURL A URL to the local file to be uploaded.
633752 215  @param uploadProgressBlock A block object to be executed when the upload progress is updated. Note this block is called on the session queue, not the main queue.
6e1425 216  @param completionHandler A block object to be executed when the task finishes. This block has no return value and takes three arguments: the server response, the response object created by that serializer, and the error that occurred, if any.
H 217
218  @see `attemptsToRecreateUploadTasksForBackgroundSessions`
219  */
220 - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request
221                                          fromFile:(NSURL *)fileURL
633752 222                                          progress:(nullable void (^)(NSProgress *uploadProgress))uploadProgressBlock
L 223                                 completionHandler:(nullable void (^)(NSURLResponse *response, id _Nullable responseObject, NSError  * _Nullable error))completionHandler;
6e1425 224
H 225 /**
226  Creates an `NSURLSessionUploadTask` with the specified request for an HTTP body.
227
228  @param request The HTTP request for the request.
229  @param bodyData A data object containing the HTTP body to be uploaded.
633752 230  @param uploadProgressBlock A block object to be executed when the upload progress is updated. Note this block is called on the session queue, not the main queue.
6e1425 231  @param completionHandler A block object to be executed when the task finishes. This block has no return value and takes three arguments: the server response, the response object created by that serializer, and the error that occurred, if any.
H 232  */
233 - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request
234                                          fromData:(nullable NSData *)bodyData
633752 235                                          progress:(nullable void (^)(NSProgress *uploadProgress))uploadProgressBlock
L 236                                 completionHandler:(nullable void (^)(NSURLResponse *response, id _Nullable responseObject, NSError * _Nullable error))completionHandler;
6e1425 237
H 238 /**
239  Creates an `NSURLSessionUploadTask` with the specified streaming request.
240
241  @param request The HTTP request for the request.
633752 242  @param uploadProgressBlock A block object to be executed when the upload progress is updated. Note this block is called on the session queue, not the main queue.
6e1425 243  @param completionHandler A block object to be executed when the task finishes. This block has no return value and takes three arguments: the server response, the response object created by that serializer, and the error that occurred, if any.
H 244  */
245 - (NSURLSessionUploadTask *)uploadTaskWithStreamedRequest:(NSURLRequest *)request
633752 246                                                  progress:(nullable void (^)(NSProgress *uploadProgress))uploadProgressBlock
L 247                                         completionHandler:(nullable void (^)(NSURLResponse *response, id _Nullable responseObject, NSError * _Nullable error))completionHandler;
6e1425 248
H 249 ///-----------------------------
250 /// @name Running Download Tasks
251 ///-----------------------------
252
253 /**
254  Creates an `NSURLSessionDownloadTask` with the specified request.
255
256  @param request The HTTP request for the request.
633752 257  @param downloadProgressBlock A block object to be executed when the download progress is updated. Note this block is called on the session queue, not the main queue.
6e1425 258  @param destination A block object to be executed in order to determine the destination of the downloaded file. This block takes two arguments, the target path & the server response, and returns the desired file URL of the resulting download. The temporary file used during the download will be automatically deleted after being moved to the returned URL.
H 259  @param completionHandler A block to be executed when a task finishes. This block has no return value and takes three arguments: the server response, the path of the downloaded file, and the error describing the network or parsing error that occurred, if any.
260
261  @warning If using a background `NSURLSessionConfiguration` on iOS, these blocks will be lost when the app is terminated. Background sessions may prefer to use `-setDownloadTaskDidFinishDownloadingBlock:` to specify the URL for saving the downloaded file, rather than the destination block of this method.
262  */
263 - (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request
633752 264                                              progress:(nullable void (^)(NSProgress *downloadProgress))downloadProgressBlock
6e1425 265                                           destination:(nullable NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination
633752 266                                     completionHandler:(nullable void (^)(NSURLResponse *response, NSURL * _Nullable filePath, NSError * _Nullable error))completionHandler;
6e1425 267
H 268 /**
269  Creates an `NSURLSessionDownloadTask` with the specified resume data.
270
271  @param resumeData The data used to resume downloading.
633752 272  @param downloadProgressBlock A block object to be executed when the download progress is updated. Note this block is called on the session queue, not the main queue.
6e1425 273  @param destination A block object to be executed in order to determine the destination of the downloaded file. This block takes two arguments, the target path & the server response, and returns the desired file URL of the resulting download. The temporary file used during the download will be automatically deleted after being moved to the returned URL.
H 274  @param completionHandler A block to be executed when a task finishes. This block has no return value and takes three arguments: the server response, the path of the downloaded file, and the error describing the network or parsing error that occurred, if any.
275  */
276 - (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData
633752 277                                                 progress:(nullable void (^)(NSProgress *downloadProgress))downloadProgressBlock
6e1425 278                                              destination:(nullable NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination
633752 279                                        completionHandler:(nullable void (^)(NSURLResponse *response, NSURL * _Nullable filePath, NSError * _Nullable error))completionHandler;
6e1425 280
H 281 ///---------------------------------
282 /// @name Getting Progress for Tasks
283 ///---------------------------------
284
285 /**
286  Returns the upload progress of the specified task.
287
633752 288  @param task The session task. Must not be `nil`.
6e1425 289
H 290  @return An `NSProgress` object reporting the upload progress of a task, or `nil` if the progress is unavailable.
291  */
633752 292 - (nullable NSProgress *)uploadProgressForTask:(NSURLSessionTask *)task;
6e1425 293
H 294 /**
295  Returns the download progress of the specified task.
296
633752 297  @param task The session task. Must not be `nil`.
6e1425 298
H 299  @return An `NSProgress` object reporting the download progress of a task, or `nil` if the progress is unavailable.
300  */
633752 301 - (nullable NSProgress *)downloadProgressForTask:(NSURLSessionTask *)task;
6e1425 302
H 303 ///-----------------------------------------
304 /// @name Setting Session Delegate Callbacks
305 ///-----------------------------------------
306
307 /**
308  Sets a block to be executed when the managed session becomes invalid, as handled by the `NSURLSessionDelegate` method `URLSession:didBecomeInvalidWithError:`.
309
310  @param block A block object to be executed when the managed session becomes invalid. The block has no return value, and takes two arguments: the session, and the error related to the cause of invalidation.
311  */
312 - (void)setSessionDidBecomeInvalidBlock:(nullable void (^)(NSURLSession *session, NSError *error))block;
313
314 /**
315  Sets a block to be executed when a connection level authentication challenge has occurred, as handled by the `NSURLSessionDelegate` method `URLSession:didReceiveChallenge:completionHandler:`.
316
317  @param block A block object to be executed when a connection level authentication challenge has occurred. The block returns the disposition of the authentication challenge, and takes three arguments: the session, the authentication challenge, and a pointer to the credential that should be used to resolve the challenge.
bf3f86 318
L 319  @warning Implementing a session authentication challenge handler yourself totally bypasses AFNetworking's security policy defined in `AFSecurityPolicy`. Make sure you fully understand the implications before implementing a custom session authentication challenge handler. If you do not want to bypass AFNetworking's security policy, use `setTaskDidReceiveAuthenticationChallengeBlock:` instead.
320
321  @see -securityPolicy
322  @see -setTaskDidReceiveAuthenticationChallengeBlock:
6e1425 323  */
633752 324 - (void)setSessionDidReceiveAuthenticationChallengeBlock:(nullable NSURLSessionAuthChallengeDisposition (^)(NSURLSession *session, NSURLAuthenticationChallenge *challenge, NSURLCredential * _Nullable __autoreleasing * _Nullable credential))block;
6e1425 325
H 326 ///--------------------------------------
327 /// @name Setting Task Delegate Callbacks
328 ///--------------------------------------
329
330 /**
331  Sets a block to be executed when a task requires a new request body stream to send to the remote server, as handled by the `NSURLSessionTaskDelegate` method `URLSession:task:needNewBodyStream:`.
332
333  @param block A block object to be executed when a task requires a new request body stream.
334  */
335 - (void)setTaskNeedNewBodyStreamBlock:(nullable NSInputStream * (^)(NSURLSession *session, NSURLSessionTask *task))block;
336
337 /**
338  Sets a block to be executed when an HTTP request is attempting to perform a redirection to a different URL, as handled by the `NSURLSessionTaskDelegate` method `URLSession:willPerformHTTPRedirection:newRequest:completionHandler:`.
339
340  @param block A block object to be executed when an HTTP request is attempting to perform a redirection to a different URL. The block returns the request to be made for the redirection, and takes four arguments: the session, the task, the redirection response, and the request corresponding to the redirection response.
341  */
633752 342 - (void)setTaskWillPerformHTTPRedirectionBlock:(nullable NSURLRequest * _Nullable (^)(NSURLSession *session, NSURLSessionTask *task, NSURLResponse *response, NSURLRequest *request))block;
6e1425 343
H 344 /**
345  Sets a block to be executed when a session task has received a request specific authentication challenge, as handled by the `NSURLSessionTaskDelegate` method `URLSession:task:didReceiveChallenge:completionHandler:`.
bf3f86 346  
L 347  @param authenticationChallengeHandler A block object to be executed when a session task has received a request specific authentication challenge.
348  
349  When implementing an authentication challenge handler, you should check the authentication method first (`challenge.protectionSpace.authenticationMethod `) to decide if you want to handle the authentication challenge yourself or if you want AFNetworking to handle it. If you want AFNetworking to handle the authentication challenge, just return `@(NSURLSessionAuthChallengePerformDefaultHandling)`. For example, you certainly want AFNetworking to handle certificate validation (i.e. authentication method == `NSURLAuthenticationMethodServerTrust`) as defined by the security policy. If you want to handle the challenge yourself, you have four options:
350  
351  1. Return `nil` from the authentication challenge handler. You **MUST** call the completion handler with a disposition and credentials yourself. Use this if you need to present a user interface to let the user enter their credentials.
352  2. Return an `NSError` object from the authentication challenge handler. You **MUST NOT** call the completion handler when returning an `NSError `. The returned error will be reported in the completion handler of the task. Use this if you need to abort an authentication challenge with a specific error.
353  3. Return an `NSURLCredential` object from the authentication challenge handler. You **MUST NOT** call the completion handler when returning an `NSURLCredential`. The returned credentials will be used to fulfil the challenge. Use this when you can get credentials without presenting a user interface.
354  4. Return an `NSNumber` object wrapping an `NSURLSessionAuthChallengeDisposition`. Supported values are `@(NSURLSessionAuthChallengePerformDefaultHandling)`, `@(NSURLSessionAuthChallengeCancelAuthenticationChallenge)` and `@(NSURLSessionAuthChallengeRejectProtectionSpace)`. You **MUST NOT** call the completion handler when returning an `NSNumber`.
355  
356  If you return anything else from the authentication challenge handler, an exception will be thrown.
357  
358  For more information about how URL sessions handle the different types of authentication challenges, see [NSURLSession](https://developer.apple.com/reference/foundation/nsurlsession?language=objc) and [URL Session Programming Guide](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/URLLoadingSystem/URLLoadingSystem.html).
359  
360  @see -securityPolicy
6e1425 361  */
bf3f86 362 - (void)setAuthenticationChallengeHandler:(id (^)(NSURLSession *session, NSURLSessionTask *task, NSURLAuthenticationChallenge *challenge, void (^completionHandler)(NSURLSessionAuthChallengeDisposition , NSURLCredential * _Nullable)))authenticationChallengeHandler;
6e1425 363
H 364 /**
365  Sets a block to be executed periodically to track upload progress, as handled by the `NSURLSessionTaskDelegate` method `URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:`.
366
367  @param block A block object to be called when an undetermined number of bytes have been uploaded to the server. This block has no return value and takes five arguments: the session, the task, the number of bytes written since the last time the upload progress block was called, the total bytes written, and the total bytes expected to be written during the request, as initially determined by the length of the HTTP body. This block may be called multiple times, and will execute on the main thread.
368  */
369 - (void)setTaskDidSendBodyDataBlock:(nullable void (^)(NSURLSession *session, NSURLSessionTask *task, int64_t bytesSent, int64_t totalBytesSent, int64_t totalBytesExpectedToSend))block;
370
371 /**
372  Sets a block to be executed as the last message related to a specific task, as handled by the `NSURLSessionTaskDelegate` method `URLSession:task:didCompleteWithError:`.
373
374  @param block A block object to be executed when a session task is completed. The block has no return value, and takes three arguments: the session, the task, and any error that occurred in the process of executing the task.
375  */
633752 376 - (void)setTaskDidCompleteBlock:(nullable void (^)(NSURLSession *session, NSURLSessionTask *task, NSError * _Nullable error))block;
6e1425 377
633752 378 /**
L 379  Sets a block to be executed when metrics are finalized related to a specific task, as handled by the `NSURLSessionTaskDelegate` method `URLSession:task:didFinishCollectingMetrics:`.
380
381  @param block A block object to be executed when a session task is completed. The block has no return value, and takes three arguments: the session, the task, and any metrics that were collected in the process of executing the task.
382  */
383 #if AF_CAN_INCLUDE_SESSION_TASK_METRICS
bf3f86 384 - (void)setTaskDidFinishCollectingMetricsBlock:(nullable void (^)(NSURLSession *session, NSURLSessionTask *task, NSURLSessionTaskMetrics * _Nullable metrics))block AF_API_AVAILABLE(ios(10), macosx(10.12), watchos(3), tvos(10));
633752 385 #endif
6e1425 386 ///-------------------------------------------
H 387 /// @name Setting Data Task Delegate Callbacks
388 ///-------------------------------------------
389
390 /**
391  Sets a block to be executed when a data task has received a response, as handled by the `NSURLSessionDataDelegate` method `URLSession:dataTask:didReceiveResponse:completionHandler:`.
392
393  @param block A block object to be executed when a data task has received a response. The block returns the disposition of the session response, and takes three arguments: the session, the data task, and the received response.
394  */
395 - (void)setDataTaskDidReceiveResponseBlock:(nullable NSURLSessionResponseDisposition (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSURLResponse *response))block;
396
397 /**
398  Sets a block to be executed when a data task has become a download task, as handled by the `NSURLSessionDataDelegate` method `URLSession:dataTask:didBecomeDownloadTask:`.
399
400  @param block A block object to be executed when a data task has become a download task. The block has no return value, and takes three arguments: the session, the data task, and the download task it has become.
401  */
402 - (void)setDataTaskDidBecomeDownloadTaskBlock:(nullable void (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSURLSessionDownloadTask *downloadTask))block;
403
404 /**
405  Sets a block to be executed when a data task receives data, as handled by the `NSURLSessionDataDelegate` method `URLSession:dataTask:didReceiveData:`.
406
407  @param block A block object to be called when an undetermined number of bytes have been downloaded from the server. This block has no return value and takes three arguments: the session, the data task, and the data received. This block may be called multiple times, and will execute on the session manager operation queue.
408  */
409 - (void)setDataTaskDidReceiveDataBlock:(nullable void (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSData *data))block;
410
411 /**
412  Sets a block to be executed to determine the caching behavior of a data task, as handled by the `NSURLSessionDataDelegate` method `URLSession:dataTask:willCacheResponse:completionHandler:`.
413
414  @param block A block object to be executed to determine the caching behavior of a data task. The block returns the response to cache, and takes three arguments: the session, the data task, and the proposed cached URL response.
415  */
416 - (void)setDataTaskWillCacheResponseBlock:(nullable NSCachedURLResponse * (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSCachedURLResponse *proposedResponse))block;
417
418 /**
419  Sets a block to be executed once all messages enqueued for a session have been delivered, as handled by the `NSURLSessionDataDelegate` method `URLSessionDidFinishEventsForBackgroundURLSession:`.
420
421  @param block A block object to be executed once all messages enqueued for a session have been delivered. The block has no return value and takes a single argument: the session.
422  */
633752 423 - (void)setDidFinishEventsForBackgroundURLSessionBlock:(nullable void (^)(NSURLSession *session))block AF_API_UNAVAILABLE(macos);
6e1425 424
H 425 ///-----------------------------------------------
426 /// @name Setting Download Task Delegate Callbacks
427 ///-----------------------------------------------
428
429 /**
430  Sets a block to be executed when a download task has completed a download, as handled by the `NSURLSessionDownloadDelegate` method `URLSession:downloadTask:didFinishDownloadingToURL:`.
431
432  @param block A block object to be executed when a download task has completed. The block returns the URL the download should be moved to, and takes three arguments: the session, the download task, and the temporary location of the downloaded file. If the file manager encounters an error while attempting to move the temporary file to the destination, an `AFURLSessionDownloadTaskDidFailToMoveFileNotification` will be posted, with the download task as its object, and the user info of the error.
433  */
633752 434 - (void)setDownloadTaskDidFinishDownloadingBlock:(nullable NSURL * _Nullable  (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, NSURL *location))block;
6e1425 435
H 436 /**
bf3f86 437  Sets a block to be executed periodically to track download progress, as handled by the `NSURLSessionDownloadDelegate` method `URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:`.
6e1425 438
H 439  @param block A block object to be called when an undetermined number of bytes have been downloaded from the server. This block has no return value and takes five arguments: the session, the download task, the number of bytes read since the last time the download progress block was called, the total bytes read, and the total bytes expected to be read during the request, as initially determined by the expected content size of the `NSHTTPURLResponse` object. This block may be called multiple times, and will execute on the session manager operation queue.
440  */
441 - (void)setDownloadTaskDidWriteDataBlock:(nullable void (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite))block;
442
443 /**
444  Sets a block to be executed when a download task has been resumed, as handled by the `NSURLSessionDownloadDelegate` method `URLSession:downloadTask:didResumeAtOffset:expectedTotalBytes:`.
445
446  @param block A block object to be executed when a download task has been resumed. The block has no return value and takes four arguments: the session, the download task, the file offset of the resumed download, and the total number of bytes expected to be downloaded.
447  */
448 - (void)setDownloadTaskDidResumeBlock:(nullable void (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t fileOffset, int64_t expectedTotalBytes))block;
449
450 @end
451
452 ///--------------------
453 /// @name Notifications
454 ///--------------------
455
456 /**
457  Posted when a task resumes.
458  */
633752 459 FOUNDATION_EXPORT NSString * const AFNetworkingTaskDidResumeNotification;
6e1425 460
H 461 /**
462  Posted when a task finishes executing. Includes a userInfo dictionary with additional information about the task.
463  */
633752 464 FOUNDATION_EXPORT NSString * const AFNetworkingTaskDidCompleteNotification;
6e1425 465
H 466 /**
467  Posted when a task suspends its execution.
468  */
633752 469 FOUNDATION_EXPORT NSString * const AFNetworkingTaskDidSuspendNotification;
6e1425 470
H 471 /**
472  Posted when a session is invalidated.
473  */
633752 474 FOUNDATION_EXPORT NSString * const AFURLSessionDidInvalidateNotification;
6e1425 475
H 476 /**
bf3f86 477  Posted when a session download task finished moving the temporary download file to a specified destination successfully.
L 478  */
479 FOUNDATION_EXPORT NSString * const AFURLSessionDownloadTaskDidMoveFileSuccessfullyNotification;
480
481 /**
6e1425 482  Posted when a session download task encountered an error when moving the temporary download file to a specified destination.
H 483  */
633752 484 FOUNDATION_EXPORT NSString * const AFURLSessionDownloadTaskDidFailToMoveFileNotification;
6e1425 485
H 486 /**
633752 487  The raw response data of the task. Included in the userInfo dictionary of the `AFNetworkingTaskDidCompleteNotification` if response data exists for the task.
6e1425 488  */
633752 489 FOUNDATION_EXPORT NSString * const AFNetworkingTaskDidCompleteResponseDataKey;
6e1425 490
H 491 /**
633752 492  The serialized response object of the task. Included in the userInfo dictionary of the `AFNetworkingTaskDidCompleteNotification` if the response was serialized.
6e1425 493  */
633752 494 FOUNDATION_EXPORT NSString * const AFNetworkingTaskDidCompleteSerializedResponseKey;
6e1425 495
H 496 /**
633752 497  The response serializer used to serialize the response. Included in the userInfo dictionary of the `AFNetworkingTaskDidCompleteNotification` if the task has an associated response serializer.
6e1425 498  */
633752 499 FOUNDATION_EXPORT NSString * const AFNetworkingTaskDidCompleteResponseSerializerKey;
6e1425 500
H 501 /**
633752 502  The file path associated with the download task. Included in the userInfo dictionary of the `AFNetworkingTaskDidCompleteNotification` if an the response data has been stored directly to disk.
6e1425 503  */
633752 504 FOUNDATION_EXPORT NSString * const AFNetworkingTaskDidCompleteAssetPathKey;
6e1425 505
H 506 /**
633752 507  Any error associated with the task, or the serialization of the response. Included in the userInfo dictionary of the `AFNetworkingTaskDidCompleteNotification` if an error exists.
6e1425 508  */
633752 509 FOUNDATION_EXPORT NSString * const AFNetworkingTaskDidCompleteErrorKey;
6e1425 510
H 511 /**
633752 512  The session task metrics taken from the download task. Included in the userInfo dictionary of the `AFNetworkingTaskDidCompleteSessionTaskMetrics`
6e1425 513  */
633752 514 FOUNDATION_EXPORT NSString * const AFNetworkingTaskDidCompleteSessionTaskMetrics;
6e1425 515
H 516 NS_ASSUME_NONNULL_END