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")
}
}
}
}
}
}
코드의 흐름을 간단히 정리하면 다음과 같습니다.
- 백그라운드 큐 실행: DispatchQueue.global(qos: .background)를 사용해 다운로드 작업을 백그라운드에서 처리합니다.
- 데이터 내려받기: NSData(contentsOf:)로 URL의 영상 데이터를 가져옵니다.
- 파일 저장: 문서 디렉터리 경로에 nameX.mp4 형태로 파일을 기록합니다.
- 사진 앨범 등록: PHPhotoLibrary의 performChanges와 PHAssetChangeRequest를 통해 저장된 파일을 사진 앱에 등록합니다.
화면에 별도의 UI 요소가 없기 때문에 화면 자체에는 변화가 없고, 콘솔의 print 출력만 확인할 수 있습니다. 성공적으로 처리되면 'Succesfully Saved'가 출력되며, 비디오는 사진 앱에서 바로 확인할 수 있습니다.
참고로 Photos 프레임워크를 사용하므로 파일 상단에 import Photos를 선언해야 합니다. 또한 실제 서비스에서는 NSData(contentsOf:) 대신 URLSession을 활용하면 더 안정적인 오류 처리와 다운로드 진행률 추적이 가능합니다.