Computer >> 컴퓨터 >  >> 프로그래밍 >> iOS

Swift로 URL에서 비디오를 다운로드해 사진 앨범에 저장하는 방법

Swift로 URL에서 비디오를 다운로드해 사진 앨범에 저장하는 방법

Swift에서 URL을 통해 비디오를 내려받아 기기의 사진 앨범에 저장하려면 몇 가지 단계를 거쳐야 하며, 구현 전에 반드시 짚고 넘어가야 할 사항들이 있습니다.

구현 전 체크리스트

  • 네트워크 권한: 비디오를 인터넷에서 내려받기 때문에 Info.plist에서 App Transport Security(ATS) 예외 설정을 허용해야 합니다.
  • 사진 라이브러리 권한: 내려받은 비디오를 사진 앱에 저장해야 하므로 사진 접근 권한이 필요합니다.
  • 백그라운드 다운로드: 비디오는 반드시 백그라운드에서 내려받아야 합니다. 메인 스레드에서 실행하면 다운로드가 끝날 때까지 앱 사용이 막힐 수 있습니다.

아래 코드를 활용하면 임의의 링크에 있는 비디오를 기기에 저장할 수 있습니다. 앱을 처음 실행할 때 사진 접근 권한 허용 팝업이 나타나면 반드시 허용해 주세요.

1단계: Info.plist에 권한 설정 추가

먼저 Info.plist 파일에 다음 항목을 추가합니다.

<key>NSPhotoLibraryUsageDescription</key>
<string>saves</string>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
  • NSPhotoLibraryUsageDescription: 사진 라이브러리에 접근하는 이유를 시스템에 알려주는 키입니다.
  • NSAppTransportSecurity / NSAllowsArbitraryLoads: HTTPS가 아닌 HTTP 주소로도 통신할 수 있게 허용하는 설정입니다. 샘플 영상 URL이 https://로 시작하기 때문에 이 설정이 필요합니다.

2단계: viewDidLoad에서 다운로드 함수 호출

다음으로 아래에서 소개할 downloadVideo() 함수를 클래스에 추가하고, viewDidLoad 메서드 안에서 호출합니다. viewDidLoad는 다음과 같이 작성하면 됩니다.

override func viewDidLoad() {
    super.viewDidLoad()
    self.downloadVideo()
}

3단계: 비디오 다운로드 및 저장 함수 구현

URL에서 비디오를 내려받아 사진 앨범에 저장하는 함수의 전체 코드는 아래와 같습니다.

import Photos

func downloadVideo() {
    let sampleURL = "https://commondatastorage.googleapis.com/gtv-videosbucket/sample/ElephantsDream.mp4"
    DispatchQueue.global(qos: .background).async {
        if let url = URL(string: sampleURL), let urlData = NSData(contentsOf: url) {
            let galleryPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
            let filePath = "\(galleryPath)/nameX.mp4"
            DispatchQueue.main.async {
                urlData.write(toFile: filePath, atomically: true)
                PHPhotoLibrary.shared().performChanges({
                    PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: URL(fileURLWithPath: filePath))
                }) { success, error in
                    if success {
                        print("Succesfully Saved")
                    } else {
                        print(error?.localizedDescription ?? "Unknown error")
                    }
                }
            }
        }
    }
}

코드의 흐름을 간단히 정리하면 다음과 같습니다.

  1. 백그라운드 큐 실행: DispatchQueue.global(qos: .background)를 사용해 다운로드 작업을 백그라운드에서 처리합니다.
  2. 데이터 내려받기: NSData(contentsOf:)로 URL의 영상 데이터를 가져옵니다.
  3. 파일 저장: 문서 디렉터리 경로에 nameX.mp4 형태로 파일을 기록합니다.
  4. 사진 앨범 등록: PHPhotoLibrary의 performChanges와 PHAssetChangeRequest를 통해 저장된 파일을 사진 앱에 등록합니다.

화면에 별도의 UI 요소가 없기 때문에 화면 자체에는 변화가 없고, 콘솔의 print 출력만 확인할 수 있습니다. 성공적으로 처리되면 'Succesfully Saved'가 출력되며, 비디오는 사진 앱에서 바로 확인할 수 있습니다.

참고로 Photos 프레임워크를 사용하므로 파일 상단에 import Photos를 선언해야 합니다. 또한 실제 서비스에서는 NSData(contentsOf:) 대신 URLSession을 활용하면 더 안정적인 오류 처리와 다운로드 진행률 추적이 가능합니다.