본문 바로가기
개발/Swift

Swift로 사진첩 앨범을 만들고 이미지를 저장하는 방법

by Wrmoon 2023. 7. 11.
반응형

Swift 로 사진첩 앨범을 만들고 이미지를 저장하는 방법

앱을 개발하다 보면 사용자의 사진을 저장하고 앨범에 저장하는 기능이 필요한 경우가 있습니다.

이번 글에서는 Swift를 이용하여 사진첩 앨범을 만들고 이미지를 저장하는 방법에 대해 알아보겠습니다.

필요 프레임워크

  • Photos
  • AssetLibrary

작업

해당 작업은 총 2단계로 이루어집니다.

  1. 앨범을 만든다.
  2. 만들어놓은 앨범내에 이미지를 저장한다.

1. 앨범을 만든다.

1. 사진첩에서 앨범을 찾기 위해 PHAssetCollection.fetchAssetCollections 메서드를 사용합니다.

let albums = PHAssetCollection.fetchAssetCollections(with: PHAssetCollectionType.album, subtype: PHAssetCollectionSubtype.any, options: nil)

 

2. 이미 해당 앨범이 존재하는 경우 eventAlbum 변수에 앨범 정보를 할당합니다.

albums.enumerateObjects { album, index, stop in	// 모든 앨범 정보 순회
            if album.localizedTitle == albumName { 	// 같은 이름의 앨범이 있다면
                eventAlbum = album as PHAssetCollection	// eventAlbum에 앨범전달
                stop.pointee = true
            }
        }

 

3. PHPhotoLibrary.shared().performChanges로 앨범을 만든다.

// 앨범 첫 생성에는 album == nil
if let album = eventAlbum {	
            completion?(.DENIED)
        } else {
            // album == nil 이면 앨범 재생성
            PHPhotoLibrary.shared().performChanges ({
                PHAssetCollectionChangeRequest.creationRequestForAssetCollection(withTitle: albumName)
            }) { succeeded, error in
                if succeeded {
                	// 앨범 재생성 후 재귀호출
                    self.saveImageInAlbum(image: image, albumName: albumName, completion: completion)
                } else {
                    // 실패
                    completion?(.ERROR)
                }
            }
        }

 

2. 만들어놓은 앨범내에 이미지를 저장한다.

  1. PHAssetChangeRequest.creationRequestForAsset를 사용하여 result 에 이미지에 대한 요청을 생성합니다.
  2. PHAssetCollectionChangeRequest 를 사용하여 albumex 에 이미지를 저장합니다.
if let albumdex = eventAlbum {
            
            PHPhotoLibrary.shared().performChanges ({
                let result = PHAssetChangeRequest.creationRequestForAsset(from: image)
                let assetPlaceholder = result.placeholderForCreatedAsset
                let albumChangeRequest = PHAssetCollectionChangeRequest(for: albumdex)
                
                let enumeration: NSArray = [assetPlaceholder!]
                albumChangeRequest!.addAssets(enumeration)
            }) { succeedded, error in
                if succeedded {
                    completion?(.SUCCESS)
                } else {
                    completion?(.ERROR)
                }
            }
            
        }
반응형

전체 코드

import Foundation
import SwiftUI
import Photos
import AssetLibrary

enum PhotoAlbumUtilResult {
   case SUCCESS, ERROR, DENIED
}

class PhotoAlbumUtil {

    class func saveImageInAlbum(image: UIImage, albumName: String, completion: ((_ result: PhotoAlbumUtilResult) -> ())?) {

        var eventAlbum: PHAssetCollection?

        let albums = PHAssetCollection.fetchAssetCollections(with: PHAssetCollectionType.album, subtype: PHAssetCollectionSubtype.any, options: nil)

        albums.enumerateObjects { album, index, stop in
            if album.localizedTitle == albumName {
                eventAlbum = album as PHAssetCollection
                stop.pointee = true
            }
        }

       if let album = eventAlbum {
            completion?(.DENIED)
        } else {

            PHPhotoLibrary.shared().performChanges ({
                PHAssetCollectionChangeRequest.creationRequestForAssetCollectionWithTitle(albumName)
            }) { succeeded, error in
                if succeeded {
                    self.saveImageInAlbum(image: image, albumName: albumName, completion: completion)
                } else {
                    // 실패
                    completion?(.ERROR)
                }
            }
        }

        if let albumdex = eventAlbum {

            PHPhotoLibrary.shared().performChanges ({
                let result = PHAssetChangeRequest.creationRequestForAsset(from: image)
                let assetPlaceholder = result.placeholderForCreatedAsset
                let albumChangeRequest = PHAssetCollectionChangeRequest(for: albumdex)

                let enumeration: NSArray = [assetPlaceholder!]
                albumChangeRequest!.addAssets(enumeration)
            }) { succeedded, error in
                if succeedded {
                    completion?(.SUCCESS)
                } else {
                    completion?(.ERROR)
                }
            }

        }
    }
}
반응형

댓글