ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • iOS [Swift] - FileManager를 이용해서 파일 다운로드 후 저장하기
    iOS Develop 2023. 1. 18. 13:21
    반응형

    내용을 살펴보기에 앞서 Apple 공식 문서에 정의된 FileManager에 대해 짚고 넘어가보겠습니다 :)

    FileManager

    • FileManager Class는 shared file manager object에 편리한 접근을 제공합니다.
    • File manager object는 일반적으로 파일 시스템과 상호 작용하는 것을 기본 모드로 합니다.
    • 따라서, 저희는 이를 통해 파일 & 디렉토리를 찾고, 만들고, 복사하고, 이동할 수 있습니다.
    • 그리고 또 파일 & 디렉토리에 대한 정보를 얻거나 속성의 일부를 변경할 때 사용할 수 있습니다. 

     

    • 만약에 파일이나 디렉토리를 이동, 복사, 연결, 제거하는 경우 file manager object와 함께 delegate를 사용하여 작업 관리를 할 수 있습니다. delegate의 역할은 작업을 확인하고, 오류가 발생할 때 진행할지 말지에 대한 여부를 결정하는 것입니다.
    • iOS 5.0 이상 & macOS 10.7 이상에서 FileManager에는 iCloud에 저장된 항목을 관리하는 메서드가 포함되어 있습니다.
    • 따라서, cloud 저장소로 태그가 지정된 파일이나 디렉토리는 iCloud에 동기화돼서 사용자의 iOS 장비나 mac에서 사용할 수 있습니다. 

    이제 FileManager에 대한 개념을 살펴 보았으니 다음 단계로 진행해보겠습니다. ㅎㅎ

    저는 "회사 자산 관리 시스템의 매뉴얼 ppt" 다운로드를 FileManager를 사용해서 아이폰 > 파일 에 저장해보도록 할 것입니다. 

    따라서, ppt를 다운로드 하는 과정은 Alamofire를 이용할 것이고, 다운로드 된 파일의 경로 설정은 FileManager를 이용할 것입니다. 🧐

     

    가장 먼저!! 우리는 FileManager를 통해 내 휴대폰의 경로를 찾아내고 그 곳에 파일을 생성하거나 수정하거나 다운로드 할 것이기 때문에..

    info.plist에 그것의 사용에 대한 permission(?)을 YES로 설정해주어야 합니다. 🫠 (Alamofire를 위해 네트워크 설정하는 것은 또 별도이기 때문에 그 것에 대한 설정도 추가해주시길 바랍니다. ㅎㅎ)

     

    SO!! 다음과 같이 값을 추가해주세용. (mac에서 휴대폰 연결하고 파일에서도 확인하고 싶으시다면, Application supports iTunes file sharing -> YES 처리 해주세용)

     

    이제 준비는 마쳤고, 코드를 살펴 보겠습니다.

    아래 코드는 download~~(url: URL, fileName: String, completion: @escaping () -> Void) 형태의 메소드로 감싸져 있는 점 참고 부탁드립니다 :) 

        // FileManager의 인스턴스를 생성합니다.
        let fileManager = FileManager.default
        
        // 사용자 기기의 document 디렉토리의 경로를 가져온다. 
        // 인자의 for 부분을 통해 다양한 디렉토리에 대한 경로를 가져올 수 있으니 SearchPathDirectory 키워드를 참고하시면 좋을 것 같습니다. :)
        let appURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0]
        
        // 위에서 사용자의 경로를 가져온 후, 맨 뒤에 저장할 파일의 이름을 저장하는 것입니다. 
        let fileURL = appURL.appendingPathComponent("csj시스템 사용법.pptx")
        
        // 최종적으로 파일이 저장될 위치에 대한 목적지 정보!!
        let destination: DownloadRequest.Destination = { _, _ in
          return (fileURL, [.removePreviousFile, .createIntermediateDirectories])
        }
    	// AlamoFire를 이용한 File Download
        AF.download(url,
                    method: .get,
                    parameters: nil,
                    encoding: JSONEncoding.default,
                    to: destination).downloadProgress { (progress) in
    	  // 설치의 진행도를 알 수 있다. 이를 가지고 시각화하여 사용자에게 제공해도 좋다.                
          print(progress.fractionCompleted)
        }.response{ response in
          if response.error != nil {
            print("파일다운로드 실패")
          }else{
            print("파일다운로드 완료")
            completionHandler()
          }
        }
Designed by Tistory.