PHPickerViewController carrega vídeos via PHAsset
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
Existe alguma maneira de evitar a permissão da biblioteca de fotos?
Sim, mais ou menos:
Mudar
PHPickerConfiguration(photoLibrary: photolibrary)paraPHPickerConfiguration()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.