PHPickerViewController charge des vidéos via PHAsset

Oct 06 2020

PHPickerViewController permet d'accéder à des copies des actifs de la photothèque et de renvoyer les PHAssets dans les résultats. Pour obtenir des PHAssets au lieu de copies de fichiers, je fais:

        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)

Et alors,

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

Mais le problème est qu'une fois que le sélecteur de photos est ignoré, il invite à accéder à la photothèque, ce qui est déroutant et puisque l'utilisateur a de toute façon implicitement donné accès aux actifs sélectionnés dans PHPickerViewController, PHPhotoLibrary devrait charger ces actifs directement. Est-il possible d'éviter la permission de la photothèque?

Réponses

2 matt Oct 06 2020 at 15:21

Est-il possible d'éviter la permission de la photothèque?

Oui, en quelque sorte:

  1. Changer PHPickerConfiguration(photoLibrary: photolibrary)pourPHPickerConfiguration()

  2. N'utilisez pas le assetIdentifierpour revenir à la photothèque (ce sera de niltoute façon)

Dans ce cas, l'utilisateur peut vous donner des données d'image mais c'est tout. Le sélecteur est hors processus et aucune donnée de la bibliothèque elle-même n'est vraiment visible, juste une simple image que l'utilisateur a explicitement sélectionnée.

Cependant, si votre objectif est vraiment de revenir à la photothèque et d'obtenir le PHAsset, vous devez avoir l'autorisation, car vous essayez maintenant de sonder la photothèque dans les coulisses de votre application.

Ce que je fais, lorsque mon application dépend des informations PHAsset, est de demander l'autorisation de la photothèque (si nécessaire) avant de présenter le sélecteur, et je ne le présente pas si je ne peux pas obtenir la permission. Donc, l'utilisateur appuie sur un bouton, je découvre que nous n'avons aucune permission, je demande la permission, nous l'obtenons (disons), et je présente le sélecteur (faisant la danse asynchrone, car l'autorisation arrive de manière asynchrone). Ça a l'air génial.

À propos, cela est également vrai avec UIImagePickerController.