PHPickerViewController는 PHAsset을 통해 비디오를로드합니다.
PHPickerViewController를 사용하면 사진 라이브러리 자산의 복사본에 액세스하고 결과에 PHAssets를 반환 할 수 있습니다. 파일 복사본 대신 PHAssets를 얻으려면 다음을 수행합니다.
let photolibrary = PHPhotoLibrary.shared()
var configuration = PHPickerConfiguration(photoLibrary: photolibrary)
configuration.filter = .videos
configuration.selectionLimit = 0
let picker = PHPickerViewController(configuration: configuration)
picker.delegate = self
self.present(picker, animated: true, completion: nil)
그리고,
//MARK:- PHPickerViewController delegate
@available(iOS 14, *)
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
picker.dismiss(animated: true) {
let identifiers:[String] = results.compactMap(\.assetIdentifier)
let fetchResult = PHAsset.fetchAssets(withLocalIdentifiers: identifiers, options: nil)
NSLog("\(identifiers), \(fetchResult)")
}
}
그러나 문제는 일단 사진 선택기가 닫히면 혼란스러운 사진 라이브러리 액세스를 요구하며 사용자가 PHPickerViewController에서 선택한 자산에 대한 액세스 권한을 암시 적으로 부여했기 때문에 PHPhotoLibrary는 해당 자산을 직접로드해야합니다. 어쨌든 사진 라이브러리 권한을 피할 수 있습니까?
답변
어쨌든 사진 라이브러리 권한을 피할 수 있습니까?
예, 일종의 :
변경
PHPickerConfiguration(photoLibrary: photolibrary)에PHPickerConfiguration()마 하지 를 사용하여
assetIdentifier사진 라이브러리로 돌아갑니다 (이 될 것입니다nil어쨌든)
이 경우 사용자가 이미지 데이터를 제공 할 수 있지만 그게 전부입니다. 선택기는 프로세스 외부이며 라이브러리 자체의 데이터는 실제로 사용자가 명시 적으로 선택한 이미지 일뿐입니다.
당신의 목표는 정말 그러나, 인 사진 라이브러리로 돌아가 PHAsset를 얻기 위해, 당신은 있어야 당신이 지금 참으로 귀하의 응용 프로그램 내 뒤에서 사진 라이브러리를 조사하려고로, 권한이 있습니다.
내 앱이 PHAsset 정보에 의존 할 때 내가하는 일은 선택기 를 제시 하기 전에 사진 라이브러리 권한 (필요한 경우)을 요청 하는 것이며, 권한을 얻을 수 없으면 선택기를 표시하지 않습니다. 따라서 사용자가 버튼을 탭하고 권한이 없음을 발견하고 권한을 요청하고이를 얻고 (예를 들어) 피커를 제시합니다 (비동기 적으로 권한이 도착하기 때문에 비동기식 댄스를합니다). 멋지네요.
그건 그렇고, UIImagePickerController에서도 마찬가지입니다.