PHPickerViewController carga videos a través de PHAsset

Oct 06 2020

PHPickerViewController permite el acceso a copias de los activos de la biblioteca de fotos, así como también devolver PHAssets en los resultados. Para obtener PHAssets en lugar de copias de archivos, hago lo siguiente:

        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)

Y entonces,

 //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)")
    }
    
}

Pero el problema es que una vez que se descarta el selector de fotos, solicita el acceso a la biblioteca de fotos, lo cual es confuso y dado que el usuario de todos modos dio acceso implícito a los activos seleccionados en PHPickerViewController, PHPhotoLibrary debería cargar esos activos directamente. ¿Hay alguna forma de evitar el permiso de la biblioteca de fotos?

Respuestas

2 matt Oct 06 2020 at 15:21

¿Hay alguna forma de evitar el permiso de la biblioteca de fotos?

Sí, algo así:

  1. Cambiar PHPickerConfiguration(photoLibrary: photolibrary)aPHPickerConfiguration()

  2. No , no utilizar el assetIdentifierpara volver a la biblioteca de fotos (que será nilde todos modos)

En ese caso, el usuario puede darle datos de imagen, pero eso es todo. El selector está fuera de proceso y no se encuentran datos de la biblioteca en sí, solo una mera imagen que el usuario ha seleccionado explícitamente.

Sin embargo, si su objetivo realmente es volver a la biblioteca de fotos y obtener el PHAsset, entonces debe tener permiso, ya que ahora está intentando sondear la biblioteca de fotos detrás de escena dentro de su aplicación.

Lo que hago, cuando mi aplicación depende de la información de PHAsset, es solicitar el permiso de la biblioteca de fotos (si es necesario) antes de presentar el selector, y no presento el selector si no puedo obtener el permiso. Entonces, el usuario presiona un botón, descubro que no tenemos permiso, pido permiso, lo obtenemos (digamos) y presento el selector (haciendo el baile asincrónico, porque el permiso llega asincrónicamente). Se ve muy bien.

Por cierto, esto también es cierto con UIImagePickerController.