[swift] Swift Device의 사진 보관 및 사진첩 기능

앱 개발을 함에 있어서 사진 관련 기능은 매우 중요합니다. Swift에서는 기기의 사진을 보관하고 사진첩을 구현하는데 사용할 수 있는 다양한 기능과 라이브러리를 제공합니다. 이번 글에서는 Swift를 사용하여 디바이스의 사진을 저장하고 사진첩을 구현하는 방법을 알아보겠습니다.

사진 저장하기

사진을 저장하기 위해 우선 카메라와 사진 라이브러리에 접근할 수 있는 권한을 얻어야 합니다. Info.plist 파일에 Privacy - Camera Usage Description과 Privacy - Photo Library Additions Usage Description 키를 추가하여 설명을 작성합니다. 이는 앱 사용자에게 권한 요청시 사용될 메시지입니다.

<key>NSCameraUsageDescription</key>
<string>카메라 접근 권한이 필요합니다.</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>사진 저장을 위한 액세스 권한이 필요합니다.</string>

사진을 저장하기 위해서는 UIImagePickerController 클래스를 사용할 수 있습니다. 이 클래스는 카메라 또는 사진 라이브러리에서 사진을 선택하고 저장할 수 있는 기능을 제공합니다.

let imagePickerController = UIImagePickerController()
imagePickerController.sourceType = .photoLibrary
imagePickerController.delegate = self

present(imagePickerController, animated: true, completion: nil)

위의 코드에서는 사진 라이브러리에서 사진을 선택할 수 있도록 UIImagePickerController를 초기화하고, 예시로 photoLibrary를 사용하였습니다. delegate 속성을 통해 선택한 사진에 대한 처리를 담당할 UIImagePickerControllerDelegate를 구현합니다. 마지막으로 present 메서드를 통해 이미지 피커 컨트롤러를 화면에 표시합니다.

선택한 사진을 저장하기 위해 didFinishPickingMediaWithInfo 메서드를 구현해야 합니다. 이 메서드에서는 선택한 사진에 대한 정보를 가져와서 사용자가 지정한 위치에 저장할 수 있습니다.

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    guard let pickedImage = info[.originalImage] as? UIImage else {
        dismiss(animated: true, completion: nil)
        return
    }
    
    UIImageWriteToSavedPhotosAlbum(pickedImage, self, #selector(image(_:didFinishSavingWithError:contextInfo:)), nil)
    
    dismiss(animated: true, completion: nil)
}

@objc func image(_ image: UIImage, didFinishSavingWithError error: Error?, contextInfo: UnsafeRawPointer) {
    if let error = error {
        print("사진 저장에 실패했습니다: \(error.localizedDescription)")
    } else {
        print("사진이 성공적으로 저장되었습니다.")
    }
}

위의 코드에서는 선택한 이미지를 가져와서 UIImageWriteToSavedPhotosAlbum 함수를 사용하여 사진첩에 저장합니다. 저장 완료 후에는 image(_:didFinishSavingWithError:contextInfo:) 메서드가 호출되며, 에러 여부에 따라 적절한 처리를 할 수 있습니다.

사진첩 구현하기

사진첩을 구현하기 위해서 PHPhotoLibrary 클래스를 사용할 수 있습니다. 이 클래스는 사진첩의 사진 정보를 가져오고 편집할 수 있는 기능을 제공합니다.

import Photos

func fetchPhotos() {
    let options = PHFetchOptions()
    options.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
    let fetchResult = PHAsset.fetchAssets(with: .image, options: options)
    
    fetchResult.enumerateObjects { (asset, _, _) in
        let manager = PHImageManager.default()
        let targetSize = CGSize(width: 200, height: 200)
        let options = PHImageRequestOptions()
        options.isSynchronous = true
        
        manager.requestImage(for: asset, targetSize: targetSize, contentMode: .aspectFit, options: options) { (image, _) in
            if let image = image {
                // 이미지 처리 코드
            }
        }
    }
}

위의 코드에서는 PHAsset.fetchAssets 메서드를 사용하여 사진첩의 사진 정보를 가져옵니다. 사진첩의 사진은 PHAsset 객체로 표현되며, 사진 정보를 사용하여 이미지를 가져올 수 있습니다. PHAsset 객체에서 requestImage 메서드를 사용하여 사진의 크기와 컨텐츠 모드 등을 지정할 수 있습니다.

사진 첩에서 가져온 이미지를 표시하고자 할 경우, 이미지 처리를 위한 코드를 구현하면 됩니다.

결론

Swift를 사용하여 디바이스의 사진을 저장하고 사진첩을 구현하는 방법에 대해 알아보았습니다. 이를 통해 앱에서 사진 관련 기능을 구현할 수 있게 되었습니다. Swift에서 제공하는 다양한 API와 라이브러리를 활용하여 더욱 다양하고 풍부한 사진 관련 기능을 구현할 수 있습니다.

참고 자료