PHPickerViewController ładuje filmy przez PHAsset

Oct 06 2020

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

2 matt Oct 06 2020 at 15:21

Czy w ogóle można uniknąć pozwolenia biblioteki zdjęć?

Tak, trochę:

  1. Zmień PHPickerConfiguration(photoLibrary: photolibrary)naPHPickerConfiguration()

  2. Czy nie użyć assetIdentifier, aby powrócić do biblioteki zdjęć (będzie to nilw 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.