PHPickerViewController ładuje filmy przez PHAsset
PHPickerViewController umożliwia dostęp do kopii zasobów biblioteki zdjęć, a także zwraca PHAssets w wynikach. Aby pobrać PHAssets zamiast kopii plików, robię:
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)
I wtedy,
//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)")
}
}
Ale problem polega na tym, że po odrzuceniu selektora zdjęć pojawia się monit o dostęp do biblioteki zdjęć, co jest mylące, a ponieważ użytkownik i tak niejawnie przyznał dostęp do wybranych zasobów w PHPickerViewController, PHPhotoLibrary powinno załadować te zasoby bezpośrednio. Czy w ogóle można uniknąć pozwolenia biblioteki zdjęć?
Odpowiedzi
Czy w ogóle można uniknąć pozwolenia biblioteki zdjęć?
Tak, trochę:
Zmień
PHPickerConfiguration(photoLibrary: photolibrary)naPHPickerConfiguration()Czy nie użyć
assetIdentifier, aby powrócić do biblioteki zdjęć (będzie tonilw każdym razie)
W takim przypadku użytkownik może podać dane obrazu, ale to wszystko. Selektor jest poza procesem i nie pojawiają się żadne dane z samej biblioteki, a jedynie zwykły obraz, który użytkownik wyraźnie wybrał.
Jeśli jednak Twoim celem naprawdę jest powrót do biblioteki zdjęć i uzyskanie zestawu PHAsset, musisz mieć pozwolenie, ponieważ teraz rzeczywiście próbujesz zbadać bibliotekę zdjęć za kulisami w swojej aplikacji.
Kiedy moja aplikacja zależy od informacji PHAsset, przed przedstawieniem selektora pytam o pozwolenie na bibliotekę zdjęć i nie przedstawiam selektora, jeśli nie mogę uzyskać pozwolenia. Czyli użytkownik naciska przycisk, odkrywam, że nie mamy pozwolenia, proszę o pozwolenie, otrzymujemy je (powiedzmy), i przedstawiam zbieracz (wykonujący taniec asynchroniczny, ponieważ zezwolenie przychodzi asynchronicznie). Wygląda świetnie.
Nawiasem mówiąc, jest to równie prawdziwe w przypadku UIImagePickerController.