"Allow the user to resume a download without starting over."
사용자가 다시 시작하지 않고도 다운로드를 재개할 수 있도록 합니다.
앱 혹은 사용자는 다운로드 중인 것을 취소할 필요가 있을 수 있으며 이후에 재개할 수도 있습니다. 재가할 수 있는 다운로드를 지원함으로써 사용자의 시간 및 네트워크 대역폭을 절약할 수 있습니다.
일시적인 연결 손실 때문에 실패한 다운로드를 재개하기 위해서 이 테크닉을 사용할 수도 있습니다.
cancel(byProducingResumeData:)
를 호출해서 URLSessionDownloadTask
를 취소할 수 있습니다. 이 메소드는 취소가 완료될 때 한 번 호출되는 컴플리션 핸들러를 받습니다. 컴플리션 핸들러는 resumeData
파라미터를 받습니다. nil
이 아니면 다운로드를 이후에 재개하기 위해 사용하는 토큰입니다. Listing 1은 다운로드 작업을 취소하는 방법 및 resumeData
가 있는 경우 이를 속성에 저장하는 방법을 보여줍니다.
Listing 1 Storing the resume data when canceling a download
downloadTask.cancel { resumeDataOrNil in
guard let resumeData = resumeDataOrNil else {
// download can't be resumed; remove from UI if necessary
return
}
self.resumeData = resumeData
}
Important
모든 다운로드가 재개될 수 있지는 않습니다. 다운로드가 재개될 수 있기에 충족되어야 하는 조건의 리스트를 보려면cancel(byProducingResumeData:)
에 있는 설명을 보시기 바랍니다. 또한, 백그라운드 설정을 사용하는 다운로드는 자동으로 재개를 처리하며, 그렇기 때문에 직접 재개하는 것은 백그라운드 다운로드가 아닌 경우에만 필요합니다.
사용자가 와이파이 범위를 빠져나갈 때처럼 일시적인 연결 손실 때문에 실패했던 다운로드를 재개할 수도 있습니다.
다운로드가 실패하면 세션은 urlSession(_:task:didCompleteWithError:)
딜리게이트 메소드를 호출합니다. 에러가 nil
이면 userInfo
딕셔너리에서 키 NSURLSessionDownloadTaskResumeData
를 찾습니다. 키가 존재하면 다운로드 재개를 시도할 때, 나중에 사용하기 위해 관련 값을 저장합니다. 키가 존재하지 않으면 다운로드는 재개될 수 없습니다.
Listing 2는 resumeData
객체가 있는 경우 에러로부터 이를 가져오고 저장하기 위한 urlSession(_:task:didCompleteWithError:)
의 구현을 보여주고 있습니다.
func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
guard let error = error else {
// Handle success case.
return
}
let userInfo = (error as NSError).userInfo
if let resumeData = userInfo[NSURLSessionDownloadTaskResumeData] as? Data {
self.resumeData = resumeData
}
// Perform any other error handling.
}
다운로드 재개가 적합한 경우 URLSession
의 downloadTask(withResumeData:)
, downloadTask(withResumeData:completionHandler:)
메소드를 사용해서 새로운 URLSessionDownloadTask
를 생성해야 합니다. 이전에 저장했던 resumeData
객체를 전달하면서 생성합니다. 다음으로 다운로드 재개를 위해 작업에 resume()
을 호출합니다.
Listing 3 Creating and starting a download task from resume data
guard let resumeData = resumeData else {
// inform the user the download can't be resumed
return
}
let downloadTask = urlSession.downloadTask(withResumeData: resumeData)
downloadTask.resume()
self.downloadTask = downloadTask
다운로드 재개가 성공적이면 작업은 딜리게이트의 urlSession(_:downloadTask:didResumeAtOffset:expectedTotalBytes:)
메소드를 호출합니다. 다운로드가 재개되었고 이전 진행사항이 보존되었다는 것을 사용자에게 알리기 위해 오프셋과 바이트 카운트 파라미터를 사용할 수 있습니다.
파일시스템에 파일을 직접 다운로드합니다.
https://developer.apple.com/documentation/foundation/url_loading_system/downloading_files_from_websites
https://velog.io/@panther222128/Downloading-Files-from-Websites
앱이 비활성화 상태인 동안 파일을 다운로드하는 작업을 생성합니다.
https://developer.apple.com/documentation/foundation/url_loading_system/downloading_files_in_the_background
https://velog.io/@panther222128/Downloading-Files-in-the-Background