Lined Notebook

PHAsset에 관하여2(with. iOS버전별 사용법, PHPicker)

by 사슴비행기

저번 글에서

 

PHAsset에 관하여(with. How to get PHAsset filename)

해당 글은 공부를 위해 공식문서를 번역한 글입니다. PHAsset은 사진 라이브러리를 이용해서 이미지나, 비디오, 라이브 포토를 다룰 때 받아지는 객체인데, 최근에 PHAsset의 메타데이터에 접근해서

doorganizedcoding.tistory.com

 

PHAsset을 순정으로 가져오기 위해서는 래핑을 해제하고 순회해야 한다고 했는데

이 방법이 변경되어 추가적으로 글을 쓰게 되었다.

이전에는 fetchAsset 메서드를 통해서 PHAsset을 가져와야 했는데,

iOS11 이후로는 UIImagePickerControllerDelegate의 메서드를 통해서 바로 PHAsset을 가져올 수 있었다.

그런데!! 놀랍게도 앞으로는 여기서 PHAsset을 가져오는 방법이 사라질 것이라는 소식을 알게되었다!!

심지어 새로운 방법은 따로 라이브러리를 쓰지 않아도 멀티 셀렉트가 가능함!! 대박스!!

그리고 그리고 심지어 사진 사용권한도 따로 설정 안해도 된단다!

세상에 마상에!


 

일단 변천사를 보자면 이렇다.

 

저번에 내가 쓴 야매 방법

asset.value(forKey: "filename")

 

iOS11 이전의 방법

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    if let imageURL = info[UIImagePickerControllerReferenceURL] as? URL {
        let result = PHAsset.fetchAssets(withALAssetURLs: [imageURL], options: nil)
        let assetResources = PHAssetResource.assetResources(for: result.firstObject!)

        print(assetResources.first!.originalFilename)
    }

    dismiss(animated: true, completion: nil)
}

 

iOS11 이후의 방법

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    if let asset = info[.phAsset] as? PHAsset {
        let resource = PHAssetResource.assetResources(for: asset)
        let fileName = resource.first?.originalFilename
    }
}

 

근데 info[.phAsset]을 하는 순간 경고창이 떴다.

 

 

ㅇㅇ 앞으로 버전에선 phAsset이 없어질거얌. 그니깐 PHPicker를 사용해!

이런 문구였다.

PHPicker가 뭐지 구글링을 해보니

처음에 적었던 것처럼 멀티 셀렉트에 권한 설정 필요없는 그런 새로운 기능이라는 것을

알게된 것이다!!

쨌든 사용법은 아래와 같다!

 

iOS14 이후 방법

import UIKit
//1. import PhotosUI
import PhotosUI

class ViewController: UIViewController {
    lazy var picker: PHPickerViewController = {
        //2. Create PHPickerConfiguration
        var configuration = PHPickerConfiguration()
        configuration.selectionLimit = 3
        configuration.filter = .any(of: [.images, .livePhotos])
        //3. Initialize PHPicker
        let picker = PHPickerViewController(configuration: configuration)
        return picker
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        picker.delegate = self
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        present(picker, animated: true, completion: nil)
    }
}

//4. conform PHPickerViewControllerDelegate
extension ViewController: PHPickerViewControllerDelegate {
    func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
        picker.dismiss(animated: true, completion: nil)
    }
}

 

이렇게 하면 따란~~

아래처럼 스무스하게 사용할 수 있다!!

어떠한 권한 설정과 라이브러리 사용 없이 말이다!

 

PHPicker를 사용해서 이미지 다루는 모습

너무 편하고 신세계인것!!!

 

근데, 일단 여기까지 하고 받아온 이미지를 다루는 건 다음번에..

지금이 벌써 새벽 네시라고?!

너무 재밌어서 이러고 있었다..;;

 


참고한 글

https://zeddios.tistory.com/1052

https://stackoverflow.com/questions/40627901/how-to-get-file-name-in-uiimagepickercontroller-with-asset-library

블로그의 정보

Beautiful Coding

사슴비행기

활동하기