PHPickerViewController carrega vídeos via PHAsset

Oct 06 2020

PHPickerViewController permite o acesso a cópias de ativos da biblioteca de fotos, bem como retornar PHAssets nos resultados. Para obter PHAssets em vez de cópias de arquivo, eu faço:

        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)

E depois,

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

Mas o problema é que uma vez que o seletor de fotos é dispensado, ele solicita acesso à Biblioteca de fotos, o que é confuso e, uma vez que o usuário de qualquer forma deu acesso implicitamente aos ativos selecionados no PHPickerViewController, o PHPhotoLibrary deve carregar esses ativos diretamente. Existe alguma maneira de evitar a permissão da biblioteca de fotos?

Respostas

2 matt Oct 06 2020 at 15:21

Existe alguma maneira de evitar a permissão da biblioteca de fotos?

Sim, mais ou menos:

  1. Mudar PHPickerConfiguration(photoLibrary: photolibrary)paraPHPickerConfiguration()

  2. Você não usar o assetIdentifierpara retornar à biblioteca de fotos (que será nilde qualquer maneira)

Nesse caso, o usuário pode fornecer dados de imagem, mas isso é tudo. O seletor está fora de processo e nenhum dado da própria biblioteca está realmente aparecendo, apenas uma mera imagem que o usuário selecionou explicitamente.

No entanto, se o seu objetivo realmente é retornar à biblioteca de fotos e obter o PHAsset, você deve ter permissão, pois agora você está realmente tentando sondar a biblioteca de fotos nos bastidores de seu aplicativo.

O que eu faço, quando meu aplicativo depende das informações do PHAsset, é pedir permissão da biblioteca de fotos (se necessário) antes de apresentar o seletor, e não apresento o seletor se não conseguir obter permissão. Então, o usuário toca um botão, descubro que não temos permissão, peço permissão, a gente consegue (digamos), e apresento o selecionador (fazendo a dança assíncrona, porque a permissão chega de forma assíncrona). Parece ótimo.

A propósito, isso também é verdade com UIImagePickerController.