hank
2017-06-22 ce8465553517c0e9b8998c3a97944a12dd567466
commit | author | age
6e1425 1 // AFURLSessionManager.h
H 2 // Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/)
3 //
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
22 #import <Foundation/Foundation.h>
23
24 #import "AFURLResponseSerialization.h"
25 #import "AFURLRequestSerialization.h"
26 #import "AFSecurityPolicy.h"
27 #if !TARGET_OS_WATCH
28 #import "AFNetworkReachabilityManager.h"
29 #endif
30
31 #ifndef NS_DESIGNATED_INITIALIZER
32 #if __has_attribute(objc_designated_initializer)
33 #define NS_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer))
34 #else
35 #define NS_DESIGNATED_INITIALIZER
36 #endif
37 #endif
38
39 /**
40  `AFURLSessionManager` creates and manages an `NSURLSession` object based on a specified `NSURLSessionConfiguration` object, which conforms to `<NSURLSessionTaskDelegate>`, `<NSURLSessionDataDelegate>`, `<NSURLSessionDownloadDelegate>`, and `<NSURLSessionDelegate>`.
41
42  ## Subclassing Notes
43
44  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.
45
46  ## NSURLSession & NSURLSessionTask Delegate Methods
47
48  `AFURLSessionManager` implements the following delegate methods:
49
50  ### `NSURLSessionDelegate`
51
52  - `URLSession:didBecomeInvalidWithError:`
53  - `URLSession:didReceiveChallenge:completionHandler:`
54  - `URLSessionDidFinishEventsForBackgroundURLSession:`
55
56  ### `NSURLSessionTaskDelegate`
57
58  - `URLSession:willPerformHTTPRedirection:newRequest:completionHandler:`
59  - `URLSession:task:didReceiveChallenge:completionHandler:`
60  - `URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:`
61  - `URLSession:task:didCompleteWithError:`
62
63  ### `NSURLSessionDataDelegate`
64
65  - `URLSession:dataTask:didReceiveResponse:completionHandler:`
66  - `URLSession:dataTask:didBecomeDownloadTask:`
67  - `URLSession:dataTask:didReceiveData:`
68  - `URLSession:dataTask:willCacheResponse:completionHandler:`
69
70  ### `NSURLSessionDownloadDelegate`
71
72  - `URLSession:downloadTask:didFinishDownloadingToURL:`
73  - `URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesWritten:totalBytesExpectedToWrite:`
74  - `URLSession:downloadTask:didResumeAtOffset:expectedTotalBytes:`
75
76  If any of these methods are overridden in a subclass, they _must_ call the `super` implementation first.
77
78  ## Network Reachability Monitoring
79
80  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.
81
82  ## NSCoding Caveats
83
84  - Encoded managers do not include any block properties. Be sure to set delegate callback blocks when using `-initWithCoder:` or `NSKeyedUnarchiver`.
85
86  ## NSCopying Caveats
87
88  - `-copy` and `-copyWithZone:` return a new manager with a new `NSURLSession` created from the configuration of the original.
89  - 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.
90
91  @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.
92  */
93
94 NS_ASSUME_NONNULL_BEGIN
95
96 #if (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000) || (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 1090) || TARGET_OS_WATCH
97
98 @interface AFURLSessionManager : NSObject <NSURLSessionDelegate, NSURLSessionTaskDelegate, NSURLSessionDataDelegate, NSURLSessionDownloadDelegate, NSSecureCoding, NSCopying>
99
100 /**
101  The managed session.
102  */
103 @property (readonly, nonatomic, strong) NSURLSession *session;
104
105 /**
106  The operation queue on which delegate callbacks are run.
107  */
108 @property (readonly, nonatomic, strong) NSOperationQueue *operationQueue;
109
110 /**
111  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`.
112
113  @warning `responseSerializer` must not be `nil`.
114  */
115 @property (nonatomic, strong) id <AFURLResponseSerialization> responseSerializer;
116
117 ///-------------------------------
118 /// @name Managing Security Policy
119 ///-------------------------------
120
121 /**
122  The security policy used by created request operations to evaluate server trust for secure connections. `AFURLSessionManager` uses the `defaultPolicy` unless otherwise specified.
123  */
124 @property (nonatomic, strong) AFSecurityPolicy *securityPolicy;
125
126 #if !TARGET_OS_WATCH
127 ///--------------------------------------
128 /// @name Monitoring Network Reachability
129 ///--------------------------------------
130
131 /**
132  The network reachability manager. `AFURLSessionManager` uses the `sharedManager` by default.
133  */
134 @property (readwrite, nonatomic, strong) AFNetworkReachabilityManager *reachabilityManager;
135 #endif
136
137 ///----------------------------
138 /// @name Getting Session Tasks
139 ///----------------------------
140
141 /**
142  The data, upload, and download tasks currently run by the managed session.
143  */
144 @property (readonly, nonatomic, strong) NSArray *tasks;
145
146 /**
147  The data tasks currently run by the managed session.
148  */
149 @property (readonly, nonatomic, strong) NSArray *dataTasks;
150
151 /**
152  The upload tasks currently run by the managed session.
153  */
154 @property (readonly, nonatomic, strong) NSArray *uploadTasks;
155
156 /**
157  The download tasks currently run by the managed session.
158  */
159 @property (readonly, nonatomic, strong) NSArray *downloadTasks;
160
161 ///-------------------------------
162 /// @name Managing Callback Queues
163 ///-------------------------------
164
165 /**
166  The dispatch queue for `completionBlock`. If `NULL` (default), the main queue is used.
167  */
168 #if OS_OBJECT_HAVE_OBJC_SUPPORT
169 @property (nonatomic, strong, nullable) dispatch_queue_t completionQueue;
170 #else
171 @property (nonatomic, assign, nullable) dispatch_queue_t completionQueue;
172 #endif
173
174 /**
175  The dispatch group for `completionBlock`. If `NULL` (default), a private dispatch group is used.
176  */
177 #if OS_OBJECT_HAVE_OBJC_SUPPORT
178 @property (nonatomic, strong, nullable) dispatch_group_t completionGroup;
179 #else
180 @property (nonatomic, assign, nullable) dispatch_group_t completionGroup;
181 #endif
182
183 ///---------------------------------
184 /// @name Working Around System Bugs
185 ///---------------------------------
186
187 /**
188  Whether to attempt to retry creation of upload tasks for background sessions when initial call returns `nil`. `NO` by default.
189
190  @bug As of iOS 7.0, there is a bug where upload tasks created for background tasks are sometimes `nil`. As a workaround, if this property is `YES`, AFNetworking will follow Apple's recommendation to try creating the task again.
191
192  @see https://github.com/AFNetworking/AFNetworking/issues/1675
193  */
194 @property (nonatomic, assign) BOOL attemptsToRecreateUploadTasksForBackgroundSessions;
195
196 ///---------------------
197 /// @name Initialization
198 ///---------------------
199
200 /**
201  Creates and returns a manager for a session created with the specified configuration. This is the designated initializer.
202
203  @param configuration The configuration used to create the managed session.
204
205  @return A manager for a newly-created session.
206  */
207 - (instancetype)initWithSessionConfiguration:(nullable NSURLSessionConfiguration *)configuration NS_DESIGNATED_INITIALIZER;
208
209 /**
210  Invalidates the managed session, optionally canceling pending tasks.
211
212  @param cancelPendingTasks Whether or not to cancel pending tasks.
213  */
214 - (void)invalidateSessionCancelingTasks:(BOOL)cancelPendingTasks;
215
216 ///-------------------------
217 /// @name Running Data Tasks
218 ///-------------------------
219
220 /**
221  Creates an `NSURLSessionDataTask` with the specified request.
222
223  @param request The HTTP request for the request.
224  @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.
225  */
226 - (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request
227                             completionHandler:(nullable void (^)(NSURLResponse *response, id __nullable responseObject,  NSError * __nullable error))completionHandler;
228
229 ///---------------------------
230 /// @name Running Upload Tasks
231 ///---------------------------
232
233 /**
234  Creates an `NSURLSessionUploadTask` with the specified request for a local file.
235
236  @param request The HTTP request for the request.
237  @param fileURL A URL to the local file to be uploaded.
238  @param progress A progress object monitoring the current upload progress.
239  @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.
240
241  @see `attemptsToRecreateUploadTasksForBackgroundSessions`
242  */
243 - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request
244                                          fromFile:(NSURL *)fileURL
245                                          progress:(NSProgress * __nullable __autoreleasing * __nullable)progress
246                                 completionHandler:(nullable void (^)(NSURLResponse *response, id __nullable responseObject, NSError  * __nullable error))completionHandler;
247
248 /**
249  Creates an `NSURLSessionUploadTask` with the specified request for an HTTP body.
250
251  @param request The HTTP request for the request.
252  @param bodyData A data object containing the HTTP body to be uploaded.
253  @param progress A progress object monitoring the current upload progress.
254  @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.
255  */
256 - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request
257                                          fromData:(nullable NSData *)bodyData
258                                          progress:(NSProgress * __nullable __autoreleasing * __nullable)progress
259                                 completionHandler:(nullable void (^)(NSURLResponse *response, id __nullable responseObject, NSError * __nullable error))completionHandler;
260
261 /**
262  Creates an `NSURLSessionUploadTask` with the specified streaming request.
263
264  @param request The HTTP request for the request.
265  @param progress A progress object monitoring the current upload progress.
266  @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.
267  */
268 - (NSURLSessionUploadTask *)uploadTaskWithStreamedRequest:(NSURLRequest *)request
269                                                  progress:(NSProgress * __nullable __autoreleasing * __nullable)progress
270                                         completionHandler:(nullable void (^)(NSURLResponse *response, id __nullable responseObject, NSError * __nullable error))completionHandler;
271
272 ///-----------------------------
273 /// @name Running Download Tasks
274 ///-----------------------------
275
276 /**
277  Creates an `NSURLSessionDownloadTask` with the specified request.
278
279  @param request The HTTP request for the request.
280  @param progress A progress object monitoring the current download progress.
281  @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.
282  @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.
283
284  @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.
285  */
286 - (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request
287                                              progress:(NSProgress * __nullable __autoreleasing * __nullable)progress
288                                           destination:(nullable NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination
289                                     completionHandler:(nullable void (^)(NSURLResponse *response, NSURL * __nullable filePath, NSError * __nullable error))completionHandler;
290
291 /**
292  Creates an `NSURLSessionDownloadTask` with the specified resume data.
293
294  @param resumeData The data used to resume downloading.
295  @param progress A progress object monitoring the current download progress.
296  @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.
297  @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.
298  */
299 - (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData
300                                                 progress:(NSProgress * __nullable __autoreleasing * __nullable)progress
301                                              destination:(nullable NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination
302                                        completionHandler:(nullable void (^)(NSURLResponse *response, NSURL * __nullable filePath, NSError * __nullable error))completionHandler;
303
304 ///---------------------------------
305 /// @name Getting Progress for Tasks
306 ///---------------------------------
307
308 /**
309  Returns the upload progress of the specified task.
310
311  @param uploadTask The session upload task. Must not be `nil`.
312
313  @return An `NSProgress` object reporting the upload progress of a task, or `nil` if the progress is unavailable.
314  */
315 - (nullable NSProgress *)uploadProgressForTask:(NSURLSessionUploadTask *)uploadTask;
316
317 /**
318  Returns the download progress of the specified task.
319
320  @param downloadTask The session download task. Must not be `nil`.
321
322  @return An `NSProgress` object reporting the download progress of a task, or `nil` if the progress is unavailable.
323  */
324 - (nullable NSProgress *)downloadProgressForTask:(NSURLSessionDownloadTask *)downloadTask;
325
326 ///-----------------------------------------
327 /// @name Setting Session Delegate Callbacks
328 ///-----------------------------------------
329
330 /**
331  Sets a block to be executed when the managed session becomes invalid, as handled by the `NSURLSessionDelegate` method `URLSession:didBecomeInvalidWithError:`.
332
333  @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.
334  */
335 - (void)setSessionDidBecomeInvalidBlock:(nullable void (^)(NSURLSession *session, NSError *error))block;
336
337 /**
338  Sets a block to be executed when a connection level authentication challenge has occurred, as handled by the `NSURLSessionDelegate` method `URLSession:didReceiveChallenge:completionHandler:`.
339
340  @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.
341  */
342 - (void)setSessionDidReceiveAuthenticationChallengeBlock:(nullable NSURLSessionAuthChallengeDisposition (^)(NSURLSession *session, NSURLAuthenticationChallenge *challenge, NSURLCredential * __nullable __autoreleasing * __nullable credential))block;
343
344 ///--------------------------------------
345 /// @name Setting Task Delegate Callbacks
346 ///--------------------------------------
347
348 /**
349  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:`.
350
351  @param block A block object to be executed when a task requires a new request body stream.
352  */
353 - (void)setTaskNeedNewBodyStreamBlock:(nullable NSInputStream * (^)(NSURLSession *session, NSURLSessionTask *task))block;
354
355 /**
356  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:`.
357
358  @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.
359  */
360 - (void)setTaskWillPerformHTTPRedirectionBlock:(nullable NSURLRequest * (^)(NSURLSession *session, NSURLSessionTask *task, NSURLResponse *response, NSURLRequest *request))block;
361
362 /**
363  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:`.
364
365  @param block A block object to be executed when a session task has received a request specific authentication challenge. The block returns the disposition of the authentication challenge, and takes four arguments: the session, the task, the authentication challenge, and a pointer to the credential that should be used to resolve the challenge.
366  */
367 - (void)setTaskDidReceiveAuthenticationChallengeBlock:(nullable NSURLSessionAuthChallengeDisposition (^)(NSURLSession *session, NSURLSessionTask *task, NSURLAuthenticationChallenge *challenge, NSURLCredential * __nullable __autoreleasing * __nullable credential))block;
368
369 /**
370  Sets a block to be executed periodically to track upload progress, as handled by the `NSURLSessionTaskDelegate` method `URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:`.
371
372  @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.
373  */
374 - (void)setTaskDidSendBodyDataBlock:(nullable void (^)(NSURLSession *session, NSURLSessionTask *task, int64_t bytesSent, int64_t totalBytesSent, int64_t totalBytesExpectedToSend))block;
375
376 /**
377  Sets a block to be executed as the last message related to a specific task, as handled by the `NSURLSessionTaskDelegate` method `URLSession:task:didCompleteWithError:`.
378
379  @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.
380  */
381 - (void)setTaskDidCompleteBlock:(nullable void (^)(NSURLSession *session, NSURLSessionTask *task, NSError * __nullable error))block;
382
383 ///-------------------------------------------
384 /// @name Setting Data Task Delegate Callbacks
385 ///-------------------------------------------
386
387 /**
388  Sets a block to be executed when a data task has received a response, as handled by the `NSURLSessionDataDelegate` method `URLSession:dataTask:didReceiveResponse:completionHandler:`.
389
390  @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.
391  */
392 - (void)setDataTaskDidReceiveResponseBlock:(nullable NSURLSessionResponseDisposition (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSURLResponse *response))block;
393
394 /**
395  Sets a block to be executed when a data task has become a download task, as handled by the `NSURLSessionDataDelegate` method `URLSession:dataTask:didBecomeDownloadTask:`.
396
397  @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.
398  */
399 - (void)setDataTaskDidBecomeDownloadTaskBlock:(nullable void (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSURLSessionDownloadTask *downloadTask))block;
400
401 /**
402  Sets a block to be executed when a data task receives data, as handled by the `NSURLSessionDataDelegate` method `URLSession:dataTask:didReceiveData:`.
403
404  @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.
405  */
406 - (void)setDataTaskDidReceiveDataBlock:(nullable void (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSData *data))block;
407
408 /**
409  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:`.
410
411  @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.
412  */
413 - (void)setDataTaskWillCacheResponseBlock:(nullable NSCachedURLResponse * (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSCachedURLResponse *proposedResponse))block;
414
415 /**
416  Sets a block to be executed once all messages enqueued for a session have been delivered, as handled by the `NSURLSessionDataDelegate` method `URLSessionDidFinishEventsForBackgroundURLSession:`.
417
418  @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.
419  */
420 - (void)setDidFinishEventsForBackgroundURLSessionBlock:(nullable void (^)(NSURLSession *session))block;
421
422 ///-----------------------------------------------
423 /// @name Setting Download Task Delegate Callbacks
424 ///-----------------------------------------------
425
426 /**
427  Sets a block to be executed when a download task has completed a download, as handled by the `NSURLSessionDownloadDelegate` method `URLSession:downloadTask:didFinishDownloadingToURL:`.
428
429  @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.
430  */
431 - (void)setDownloadTaskDidFinishDownloadingBlock:(nullable NSURL * (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, NSURL *location))block;
432
433 /**
434  Sets a block to be executed periodically to track download progress, as handled by the `NSURLSessionDownloadDelegate` method `URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesWritten:totalBytesExpectedToWrite:`.
435
436  @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.
437  */
438 - (void)setDownloadTaskDidWriteDataBlock:(nullable void (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite))block;
439
440 /**
441  Sets a block to be executed when a download task has been resumed, as handled by the `NSURLSessionDownloadDelegate` method `URLSession:downloadTask:didResumeAtOffset:expectedTotalBytes:`.
442
443  @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.
444  */
445 - (void)setDownloadTaskDidResumeBlock:(nullable void (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t fileOffset, int64_t expectedTotalBytes))block;
446
447 @end
448
449 #endif
450
451 ///--------------------
452 /// @name Notifications
453 ///--------------------
454
455 /**
456  Posted when a task begins executing.
457
458  @deprecated Use `AFNetworkingTaskDidResumeNotification` instead.
459  */
460 extern NSString * const AFNetworkingTaskDidStartNotification DEPRECATED_ATTRIBUTE;
461
462 /**
463  Posted when a task resumes.
464  */
465 extern NSString * const AFNetworkingTaskDidResumeNotification;
466
467 /**
468  Posted when a task finishes executing. Includes a userInfo dictionary with additional information about the task.
469
470  @deprecated Use `AFNetworkingTaskDidCompleteNotification` instead.
471  */
472 extern NSString * const AFNetworkingTaskDidFinishNotification DEPRECATED_ATTRIBUTE;
473
474 /**
475  Posted when a task finishes executing. Includes a userInfo dictionary with additional information about the task.
476  */
477 extern NSString * const AFNetworkingTaskDidCompleteNotification;
478
479 /**
480  Posted when a task suspends its execution.
481  */
482 extern NSString * const AFNetworkingTaskDidSuspendNotification;
483
484 /**
485  Posted when a session is invalidated.
486  */
487 extern NSString * const AFURLSessionDidInvalidateNotification;
488
489 /**
490  Posted when a session download task encountered an error when moving the temporary download file to a specified destination.
491  */
492 extern NSString * const AFURLSessionDownloadTaskDidFailToMoveFileNotification;
493
494 /**
495  The raw response data of the task. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if response data exists for the task.
496
497  @deprecated Use `AFNetworkingTaskDidCompleteResponseDataKey` instead.
498  */
499 extern NSString * const AFNetworkingTaskDidFinishResponseDataKey DEPRECATED_ATTRIBUTE;
500
501 /**
502  The raw response data of the task. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if response data exists for the task.
503  */
504 extern NSString * const AFNetworkingTaskDidCompleteResponseDataKey;
505
506 /**
507  The serialized response object of the task. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if the response was serialized.
508
509  @deprecated Use `AFNetworkingTaskDidCompleteSerializedResponseKey` instead.
510  */
511 extern NSString * const AFNetworkingTaskDidFinishSerializedResponseKey DEPRECATED_ATTRIBUTE;
512
513 /**
514  The serialized response object of the task. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if the response was serialized.
515  */
516 extern NSString * const AFNetworkingTaskDidCompleteSerializedResponseKey;
517
518 /**
519  The response serializer used to serialize the response. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if the task has an associated response serializer.
520
521  @deprecated Use `AFNetworkingTaskDidCompleteResponseSerializerKey` instead.
522  */
523 extern NSString * const AFNetworkingTaskDidFinishResponseSerializerKey DEPRECATED_ATTRIBUTE;
524
525 /**
526  The response serializer used to serialize the response. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if the task has an associated response serializer.
527  */
528 extern NSString * const AFNetworkingTaskDidCompleteResponseSerializerKey;
529
530 /**
531  The file path associated with the download task. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if an the response data has been stored directly to disk.
532
533  @deprecated Use `AFNetworkingTaskDidCompleteAssetPathKey` instead.
534  */
535 extern NSString * const AFNetworkingTaskDidFinishAssetPathKey DEPRECATED_ATTRIBUTE;
536
537 /**
538  The file path associated with the download task. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if an the response data has been stored directly to disk.
539  */
540 extern NSString * const AFNetworkingTaskDidCompleteAssetPathKey;
541
542 /**
543  Any error associated with the task, or the serialization of the response. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if an error exists.
544
545  @deprecated Use `AFNetworkingTaskDidCompleteErrorKey` instead.
546  */
547 extern NSString * const AFNetworkingTaskDidFinishErrorKey DEPRECATED_ATTRIBUTE;
548
549 /**
550  Any error associated with the task, or the serialization of the response. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if an error exists.
551  */
552 extern NSString * const AFNetworkingTaskDidCompleteErrorKey;
553
554 NS_ASSUME_NONNULL_END