#🔧 Exercice 2 - Importer un fichier au runtime

Actuellement nos fichiers ne sont disponibles que si le développeur les ajoute à l’application avant de la compiler. Dans la vie réelle cette application ne sert donc pas à grand chose.

Encore une fois, il existe une API pour importer des fichiers dans une application iOS, il s’agit de UIDocumentPicker.

Le problème peut paraitre assez complexe pour un débutant, dans ce cas, pensez toujours à découper votre problème dans une suite logique d’étapes :

  1. Ajoutez un bouton dans la barre de navigation pour lancer l’ajout de document
  2. Créez une fonction pour lancer UIDocumentPicker
  3. Utilisez UIDocumentPickerDelegate pour ajouter un document
  4. Ajoutez le fichier dans le stockage de l’application
  5. Créez une fonction pour récupérer la liste des fichiers dans le stockage de l’application en parallèle de la liste des fichiers dans le bundle de l’application

Voilà !

Détaillons chaque partie maintenant

#Ajouter un bouton dans la barre de navigation

On pourrait utiliser le storyboard et faire la liaison via la technique du drag-n-drop avec l’assistant “IBOutlets”, mais ici on va le faire en code :

// Dans ViewDidLoad()
navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addDocument))

#📝 Questions

  • Expliquez ce qu’est un #selector en Swift
  • Que représente .add dans notre appel ?
  • Expliquez également pourquoi XCode vous demande de mettre le mot clé @objc devant la fonction ciblée par le #selector
  • Peut-on ajouter plusieurs boutons dans la barre de navigation ? Si oui, comment en code ?

#Utiliser UIDocumentPicker

✅ Vous avez une fonction qui est appelé lors du clic sur un bouton dans la barre de navigation.

Maintenant il faut remplir cette fonction. On veut à présent lancer le picker système au clic sur le bouton.

Le fonctionnement d’un picker se fait en 2 étapes :

  1. 👩🏼‍🦰 Le lancement du picker système, une interface qui va permettre à l’utilisateur de choisir un fichier dans son téléphone
  2. 🗂️ La récupération du fichier sélectionné par l’utilisateur, grâce au protocole UIDocumentPickerDelegate, qui permet au développeur d’obtenir les informations du fichier choisit par l’utilisateur et d’en disposer dans l’application.

Pour vous guider, utiliser le lien ci-dessous ⬇️

🛟 De l’aide sur comment réaliser cet exercice : https://nemecek.be/blog/155/how-to-let-user-select-file-from-files

💡 Utilisez une extension pour ajouter l’implémentation du protocole UIDocumentPickerDelegate à votre DocumentTableViewController

#Ajouter le fichier dans le stockage de l’application

✅ Vous êtes capable de lancer le picker
✅ Vous récupérez le fichier sélectionné par l’utilisateur

Il faut maintenant le copier dans le stockage de l’application.

Je vous donne une fonction pour faire la copie du fichier vers le .documentDirectory de l’application, qui est une URL spécifique que le système va nous fournir pour stocker des fichiers dans l’application.

    func copyFileToDocumentsDirectory(fromUrl url: URL) {
        // On récupère le dossier de l'application, dossier où nous avons le droit d'écrire nos fichiers
        let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
        
        // Nous créons une URL de destination pour le fichier
        let destinationUrl = documentsDirectory.appendingPathComponent(url.lastPathComponent)
        
        do {
            // Puis nous copions le fichier depuis l'URL source vers l'URL de destination
            try FileManager.default.copyItem(at: url, to: destinationUrl)
        } catch {
            print(error)
        }
    }

💡 La variable documentsDirectory sera à utiliser pour récupérer la liste des fichiers dans le dossier de l’application et afficher la liste qui prendra en compte les documents importés.

💡 En effet, sous iOS, le développeur n’a pas accès aux vrais URLs de l’appareil pour des questions de vie privée et de sécurité. Aussi nous devons nous conformer à ce que le système nous fournit.

🛟 https://www.hackingwithswift.com/books/ios-swiftui/writing-data-to-the-documents-directory

#📝 Questions

  • A quoi sert la fonction defer ?

#Lister les fichiers

✅ Vous avez stocké le fichier dans l’application

Il faut maintenant l’afficher. Pour ça vous allez devoir le récupérer dans le dossier de l’application, en faire un DocumentFile et l’ajouter à la DataSource de votre TableViewController.

‼️ Attention ! On doit pouvoir lister tout types de fichier, y compris autre choses que des images. Pensez à modifier vos fonctions en conséquences, le QLPreviewController est capable d’afficher quasiment tous les types de fichiers.

Normalement vous devriez y parvenir sans trop de difficultés grâce à ce que nous avons vu avant.

#Ressources