본문 바로가기
개발/ios (swift)

ios version에 따라 gallery에서 이미지 가지고 오는 방법

by 즐거운 개발 인생 2022. 3. 2.
728x90
반응형

language : swift (using storyboard)

how to get image from gallery according to ios version.

import UIKit
import Photos
import PhotosUI

ios 14부터 PHPicker 사용

ios 14 미만은 UIImagePicker 사용

ios 버전에 따라 두가지 방법을 사용.

    @IBAction func touchUpAddImage(_ sender: UIButton) {
        if #available(iOS 14, *) {
           pickImage()
        } else {
            openGallery()
        }
    }

 

ios 14이상인 경우 PHPicker 사용

using PHPicker when higher than ios 14

//ios 14 이상일 때 phpicker 사용 //use phpicker when higher than ios 14
@available(iOS 14, *)
extension PreviewViewController: PHPickerViewControllerDelegate {
    func pickImage(){
        
            var configuration = PHPickerConfiguration()
//	이미지 정보를 가지고 올 필요가 있을땐 photolibarary 를 사용해준다. //use when need image file info.            
//            let photoLibrary = PHPhotoLibrary.shared()
//            var configuration = PHPickerConfiguration(photoLibrary: photoLibrary)

            configuration.selectionLimit = 1 //한번에 가지고 올 이미지 갯수 제한 //limit selectable image counts
            configuration.filter = .any(of: [.images])
            
            let picker = PHPickerViewController(configuration: configuration)
            picker.delegate = self
            self.present(picker, animated: true, completion: nil)
    }
    
    
    func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
          
        var imgData: Data?
        var img: UIImage?
        
        var imgFile = PreviewItem()
        
        picker.dismiss(animated: true, completion: nil)
        
        let itemProvider = results.first?.itemProvider
        
        if let itemProvider = itemProvider,
           itemProvider.canLoadObject(ofClass: UIImage.self){
            itemProvider.loadObject(ofClass: UIImage.self) {
                (image, error) in
                DispatchQueue.main.async {
            		self.preview.image = image as? UIImage
                    
                    //이미지의 정보가 필요할때 사용하는 코드
//                    let identifiers = results.compactMap(\.assetIdentifier)
//                    let fetchResult = PHAsset.fetchAssets(withLocalIdentifiers: identifiers, options: nil)

//                    if let filename = fetchResult.firstObject?.value(forKey: "filename") as? String{
//                       이미지의 이름을 가지고 옴//get image file name
//                    }
                    
                }
            }
        }
       
    }
}

 

ios 14 미만인 경우 UIImagePicker 사용

using UIImagePicker when lower than ios 14

//ios 14 미만 //used when lower than ios 14
extension PreviewViewController: UIImagePickerControllerDelegate {
    func openGallery(){
        let picker = UIImagePickerController()
        picker.delegate = self
        
        picker.sourceType = .photoLibrary
        present(picker, animated: true, completion: nil)
    }
    
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage{
            DispatchQueue.main.async {
            	self.preview.image = image
            }

            //이미지 파일 이름 가져옴//get image file name
//            var fileName: String = ""
//            let imgData = image.jpegData(compressionQuality: 1.0)
//            if let asset = info[UIImagePickerController.InfoKey.phAsset] as? PHAsset{
//                fileName = asset.value(forKey: "filename") as? String ?? ""
            }
            
        }
       
        self.dismiss(animated: true, completion: nil)
    }
    
    
}

 

ios 14 이상인 경우 phpicker를 이용해 이미지를 가지고 오는 데 phpicker의 경우 photo library를 이용해 이미지 권한 확인을 하지 않는 다. 하지만 이때 PHAsset.fetchAssets를 사용해 이미지 정보를 가지고 오면 이미지를 가지고 온 후에 이미지 권한 alert창이 뒤늦게 뜨는 오류가 발생한다. 

 

프로젝트의 Info에서 Prevent limited photos access alert를 YES로 등록하니 권한 alert가 나타나지 않으면서 이미지 정보를 가지고 올 수 있다.

Info의 prevent limited photos access alert를 YES로 등록

 

728x90
반응형

'개발 > ios (swift)' 카테고리의 다른 글

scroll up textfield when keyboard show  (0) 2022.08.08
UITextview Placeholder  (0) 2022.03.03
action when clicked button in cell of collectionView  (0) 2022.03.02
사파리로 링크 열기  (0) 2022.02.18

댓글