Notice
Recent Posts
Recent Comments
Link
투케이2K
520. (ios/swift5) URLSession downloadTask 사용해 실시간 파일 다운로드 진행 상태 확인 - URLSessionDownloadDelegate 본문
IOS
520. (ios/swift5) URLSession downloadTask 사용해 실시간 파일 다운로드 진행 상태 확인 - URLSessionDownloadDelegate
투케이2K 2024. 4. 26. 09:49[개발 환경 설정]
개발 툴 : XCODE
개발 언어 : SWIFT5
[소스 코드]
// -----------------------------------------------------------------------------------------
// MARK: - [테스트 메인 함수 정의 실시]
// -----------------------------------------------------------------------------------------
func testMain() {
S_Log._D_(description: "테스트 함수 시작 실시", data: nil)
/*
// -------------------------------------------------------
[요약 설명]
// -------------------------------------------------------
1. 필요 info plist 설정
http 허용 : App Transport Security Settings >> Allow Arbitrary Loads >> YES
// -------------------------------------------------------
2. 필요 딜리게이트 : URLSessionDownloadDelegate
ex : ViewController: UIViewController, URLSessionDownloadDelegate
// -------------------------------------------------------
*/
// [로직 처리 실시]
DispatchQueue.main.async {
// -----------------------------------------
// [HTTP 요청 주소 정의]
// -----------------------------------------
let urlData = "http://dev.twok.co.kr:5800/FileTest/test.png"
// -----------------------------------------
// [URLRequest 생성 실시]
// -----------------------------------------
let urlComponents = URLComponents(string: urlData)
var requestURL = URLRequest(url: (urlComponents?.url)!)
requestURL.httpMethod = "GET"
requestURL.addValue("application/x-www-form-urlencoded; charset=utf-8;", forHTTPHeaderField: "Content-Type") // header settings
requestURL.addValue("no-cache", forHTTPHeaderField: "Cache-Control") // header settings
S_Log._D_(description: "파일 다운로드 GET 방식 HTTP [요청] 수행", data: [
"TYPE :: GET >> REQUEST",
"URL :: " + String(describing: urlData)
])
// -----------------------------------------
// [http 요쳥을 위한 URLSessionDataTask 생성]
// -----------------------------------------
let sessionConfig = URLSessionConfiguration.default
sessionConfig.timeoutIntervalForRequest = 30 // [커넥션 타임 아웃 설정]
//sessionConfig.timeoutIntervalForResource = 30 // [리소스 읽기 , 쓰기]
let session = URLSession(configuration: sessionConfig, delegate: self, delegateQueue: nil)
// -----------------------------------------
// [파일 다운 로드 요청 수행]
// -----------------------------------------
let downloadTask = session.downloadTask(with: requestURL)
downloadTask.resume() // [network 통신 실행]
}
}
// -----------------------------------------------------------------------------------------
// MARK: - [URLSessionDownloadDelegate] : [파일 다운로드 완료 상태 체크]
// -----------------------------------------------------------------------------------------
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {
//S_Log._D_(description: "URLSessionDownloadDelegate >> didFinishDownloadingTo :: 파일 다운로드 완료 상태", data: nil)
do {
// [Data 읽기 수행]
let data = try Data(contentsOf: location, options: [.mappedIfSafe])
// [Data 이미지 변환]
let image : UIImage = UIImage(data: data)!
// [이미지 표시]
self.observableImage(title: "파일 다운로드 확인", image: image, okBtn:"확인", noBtn: "취소"){(result) in
S_Log._D_(description: "이미지 팝업창 버튼 클릭 콜백 결과 확인", data: ["\(result)"])
}
} catch {
S_Log._D_(description: "URLSessionDownloadDelegate >> didFinishDownloadingTo :: 파일 저장 에러 발생", data: [
"catch :: \(error.localizedDescription)"
])
}
}
// -----------------------------------------------------------------------------------------
// MARK: - [URLSessionDownloadDelegate] : [파일 다운로드 완료 및 에러 상태 체크]
// -----------------------------------------------------------------------------------------
func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
guard error == nil else {
S_Log._D_(description: "URLSessionDownloadDelegate >> didCompleteWithError :: 파일 다운로드 에러 발생", data: [
"ERROR :: \(error?.localizedDescription ?? "")"
])
// [리턴 반환]
return
}
// [status 코드 체크 실시]
let successsRange = 200..<300
guard let statusCode = (task.response as? HTTPURLResponse)?.statusCode, successsRange.contains(statusCode)
else {
S_Log._D_(description: "URLSessionDownloadDelegate >> didCompleteWithError :: 파일 다운로드 에러 발생", data: [
"STATUS CODE :: " + String(describing: (task.response as? HTTPURLResponse)?.statusCode ?? 0),
"RESPONSE DATA :: \((task.response as? HTTPURLResponse)?.description ?? "")"
])
// [리턴 반환]
return
}
// [response 데이터 획득]
let resultCode = (task.response as? HTTPURLResponse)?.statusCode ?? 0
let resultMime = task.response?.mimeType ?? ""
S_Log._D_(description: "URLSessionDownloadDelegate >> didCompleteWithError :: 파일 다운로드 상태 확인", data: [
"STATUS_CODE :: \(resultCode)",
"RESPONSE_MIME :: \(resultMime)"
])
}
// -----------------------------------------------------------------------------------------
// MARK: - [URLSessionDownloadDelegate] : [파일 다운로드 진행 상태 체크]
// -----------------------------------------------------------------------------------------
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) {
let currentProgress = ( Float(totalBytesWritten) / Float(totalBytesExpectedToWrite) ) * 100
let totalSize = ByteCountFormatter.string(fromByteCount: totalBytesExpectedToWrite, countStyle: .file)
S_Log._D_(description: "URLSessionDownloadDelegate >> totalBytesExpectedToWrite :: 파일 다운로드 진행 상태 확인", data: [
"Progress :: \(currentProgress)",
"TotalSize :: \(totalSize)"
])
}
[결과 출력]
반응형
'IOS' 카테고리의 다른 글
Comments