[iOS] Extension UIDocumentProvider

mardi 7 février 2017

Est une extension depuis iOS8 qui permet à une application de partager ses documents avec les autres applications sur l’appareil d’un utilisateur de manière sûre et pratique.

C’est aussi une solution de partager des données sans appartenir nécessairement au App group d’une autre application.

Petit rappel: quand vous créez des documents ou lisez des documents, vous êtes autorisé à le faire uniquement dans la sandbox de votre application.
Chaque application possède sa propre sandbox et les autres applications n’ont pas accès à la sandbox des autres applications.
Même une extension d’application n’a pas accès à la sandbox de son application.

Apple propose aussi le concept d’App group d’applications: une collection d’applications créée par la même équipe de développement qui permet à deux applications ou plus d’accéder aux conteneurs de données partagés. Ce concept permet donc aux application ou extensions d’avoir un ensemble partagé de fichiers mais seulement si votre utilisateur utilise uniquement ses propres applications.

Pour plus d’info sur ce concept cliquez ici

UIDocumentProvider permet de fournir des fichiers aux applications d’autres développeurs.

Il existe 4 types d’interaction lors de l’accès aux fichiers

  • Importation:les données sont dupliquées depuis l’application container vers l’application tierce.
  • Ouvrir:l’application tierce peut modifier un fichier dans l’application container et le sauvegarder dans l’application container
  • ExportToService:les données sont dupliquées depuis l’application tierce vers l’application container
  • MoveToService:l’application tierce déplace un fichier vers application container.

Mise en place:

Ajout de l’extension dans le projet:

  • Dans le project navigator, on clique sur + pour ajouter une nouvelle target et choisissez iOS>Application Extension>Document Provider.
  • Choisissez un nom
  • Activer le dans le scheme
  • Vous aurez deux targets supplémentaires (premier avec le nom choisi et le second nom_choisiFileProvider
  • Xcode créé aussi deux répertoires dans votre projet. Le premier contient DocumentPickerViewController qui est une sous classe de UIDocumentPickerExtensionViewController et représente la vue affichée dans l’application tierce lorsque vous utilisez l’extension. Sous le répertoire nom_choisiFileProvider, un fichier Le FileProvider coordonne l’ensemble de la lecture et l’écriture pendant les opérations de fichier.
  • Xcode a aussi créé l’App group pour les deux nouvelles cibles. à vérifier
  • Ensuite dans la target de votre projet, vous devez activé la capabilities App Groups et mettre le même identifiant que les deux autres.

Maintenant, il faut être sur que l’extension puisse voir les fichiers de l’app.

Il faut créé une constante avec l’identifiant du App Group

static let appGroupIdentifier = "YOUR APP GROUP IDENTIFIER"

Il faut aussi rajouter la fonction suivante pour retourner l’url des fichiers à accéder dans l’extension et utiliser cette url pour écrire les fichiers de votre application container de l’extension.
Maintenant l’application container de l’extension écrira ou modifiera les fichiers depuis ce répertoire partagé et non plus dans la sandbox.

static func appGroupContainerURL() -> URL? {
  // 1
  let fileManager = FileManager.default
  guard let groupURL = fileManager
    .containerURL(forSecurityApplicationGroupIdentifier: appGroupIdentifier) else {
      return nil
  }
 
  let storagePathUrl = groupURL.appendingPathComponent("File Provider Storage")
  let storagePath = storagePathUrl.path
  // 2
  if !fileManager.fileExists(atPath: storagePath) {
    do {
      try fileManager.createDirectory(atPath: storagePath,
                                              withIntermediateDirectories: false,
                                              attributes: nil)
    } catch let error {
      print("error creating filepath: \(error)")
      return nil
    }
  }
  // 3
  return storagePathUrl
}

Pour la suite il faut développer l’extension, d’ou vous trouverez un exemple ici

Tags: Extension , IOS , UIDocumentProvider