<!--
{
  "availability" : [
    "iOS: 2.0.0 -",
    "iPadOS: 2.0.0 -",
    "macCatalyst: 13.0.0 -",
    "macOS: 10.0.0 -",
    "tvOS: 9.0.0 -",
    "visionOS: 1.0.0 -",
    "watchOS: 2.0.0 -"
  ],
  "documentType" : "symbol",
  "framework" : "Foundation",
  "identifier" : "/documentation/Foundation/URLSession/downloadTask(withResumeData:completionHandler:)",
  "metadataVersion" : "0.1.0",
  "role" : "Instance Method",
  "symbol" : {
    "kind" : "Instance Method",
    "modules" : [
      "Foundation"
    ],
    "preciseIdentifier" : "c:objc(cs)NSURLSession(im)downloadTaskWithResumeData:completionHandler:"
  },
  "title" : "downloadTask(withResumeData:completionHandler:)"
}
-->

# downloadTask(withResumeData:completionHandler:)

Creates a download task to resume a previously canceled or failed download and calls a handler upon completion.

```
func downloadTask(withResumeData resumeData: Data, completionHandler: @escaping @Sendable (URL?, URLResponse?, (any Error)?) -> Void) -> URLSessionDownloadTask
```

## Parameters

`resumeData`

A data object that provides the data necessary to resume the download.

`completionHandler`

The completion handler to call when the load request is complete. This handler is executed on the delegate queue.

    If you pass     `nil`    , only the session delegate methods are called when the task completes, making this method equivalent to the [`downloadTask(withResumeData:)`](/documentation/Foundation/URLSession/downloadTask(withResumeData:))     method.

- `location`: The location of a temporary file where the server’s response is stored. You must move this file or open it for reading before your completion handler returns. Otherwise, the file is deleted, and the data is lost.
- `response`: An object that provides response metadata, such as HTTP headers and status code. If you are making an HTTP or HTTPS request, the returned object is actually an [`HTTPURLResponse`](/documentation/Foundation/HTTPURLResponse) object.
- `error`: An error object that indicates why the request failed, or `nil` if the request was successful.

## Return Value

The new session download task.

## Discussion

By using a completion handler, the task bypasses calls to delegate methods for response and data delivery, and instead provides any resulting data, response, or error inside the completion handler. Delegate methods for handling authentication challenges, however, are still called.

You should pass a `nil` completion handler *only* when creating tasks in sessions whose delegates include a [`urlSession(_:downloadTask:didFinishDownloadingTo:)`](/documentation/Foundation/URLSessionDownloadDelegate/urlSession(_:downloadTask:didFinishDownloadingTo:)) method.

Your app can obtain a `resumeData` object in two ways:

- If your app cancels an existing transfer by calling [`cancel(byProducingResumeData:)`](/documentation/Foundation/URLSessionDownloadTask/cancel(byProducingResumeData:)), the session object passes a `resumeData` object to the completion handler that you provided in that call.
- If a transfer fails, the session object provides an `NSError` object either to its delegate or to the task’s completion handler. In that object, the [`NSURLSessionDownloadTaskResumeData`](/documentation/Foundation/NSURLSessionDownloadTaskResumeData) key in the `userInfo` dictionary contains a `resumeData` object.

After you create the task, you must start it by calling its [`resume()`](/documentation/Foundation/URLSessionTask/resume()) method.

If the request completes successfully, the `location` parameter of the completion handler block contains the location of the temporary file, and the `error` parameter is `nil`. If the request fails, the `location` parameter is `nil` and the `error` parameter contain information about the failure. If a response from the server is received, regardless of whether the request completes successfully or fails, the `response` parameter contains that information.

> Note:
> A download can be resumed only if it is an HTTP or HTTPS `GET` request, and only if the remote server supports byte-range requests (with the `Range` header) and provides the `ETag` or `Last-Modified` header in its responses. A download may also restart if the file on the server has been modified, or if the temporary file has been deleted because of low disk space.

---

Copyright &copy; 2026 Apple Inc. All rights reserved. | [Terms of Use](https://www.apple.com/legal/internet-services/terms/site.html) | [Privacy Policy](https://www.apple.com/privacy/privacy-policy)