PHPickerViewController carica i video tramite PHAsset
PHPickerViewController consente l'accesso alle copie delle risorse della libreria di foto e restituisce PHAssets nei risultati. Per ottenere PHAssets invece di copie di file, faccio:
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 poi,
//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)")
}
}
Ma il problema è che una volta che il selettore di foto viene chiuso, richiede l'accesso alla libreria di foto che è fonte di confusione e poiché l'utente ha comunque dato implicitamente l'accesso alle risorse selezionate in PHPickerViewController, PHPhotoLibrary dovrebbe caricare quelle risorse direttamente. C'è comunque da evitare il permesso della libreria fotografica?
Risposte
C'è comunque da evitare il permesso della libreria fotografica?
Sì, una specie di:
Cambia
PHPickerConfiguration(photoLibrary: photolibrary)inPHPickerConfiguration()Evitare Non utilizzare il
assetIdentifierper tornare alla libreria di foto (che sarànilcomunque)
In tal caso, l'utente può fornirti i dati dell'immagine, ma questo è tutto. Il selettore è out-of-process e nessun dato dalla libreria stessa sta realmente arrivando, solo una semplice immagine che l'utente ha selezionato esplicitamente.
Tuttavia, se il tuo obiettivo è davvero tornare alla libreria di foto e ottenere il PHAsset, allora devi avere il permesso, poiché ora stai effettivamente tentando di sondare la libreria di foto dietro le quinte all'interno della tua app.
Quello che faccio, quando la mia app dipende dalle informazioni PHAsset, è chiedere l'autorizzazione alla libreria di foto (se necessario) prima di presentare il selettore e non lo presento se non riesco a ottenere l'autorizzazione. Quindi, l'utente tocca un pulsante, scopro che non abbiamo il permesso, chiedo il permesso, lo otteniamo (diciamo) e presento il selettore (facendo la danza asincrona, perché il permesso arriva in modo asincrono). Sembra fantastico.
A proposito, questo è altrettanto vero con UIImagePickerController.