App Group est un mécanisme iOS qui crée un conteneur partagé pour l’échange de données entre une application et ses extensions. Sans lui, chaque processus (application principale, widget, extension de partage) fonctionne dans un bac à sable isolé et n’a pas accès aux données d’un composant voisin. Selon Apple Developer Documentation, 2026, App Group résout ce problème grâce à un identifiant de groupe unique spécifié dans les droits. C’est un outil fondamental pour créer une expérience utilisateur cohérente dans l’écosystème iOS.
Points clés
App Group est un mécanisme du système d’exploitation iOS qui fournit une zone de stockage partagée pour plusieurs processus du même développeur. Sans lui, chaque extension fonctionne dans son propre bac à sable et ne peut pas lire les données écrites par un autre composant. App Group résout cet isolement en créant un répertoire sur le système de fichiers accessible à tous les processus avec les droits appropriés.
L’identifiant de groupe commence par le préfixe group. et est spécifié dans le fichier de droits du projet. Dans Xcode, cet identifiant est ajouté via Capabilities — le système l’inclut automatiquement dans la signature de l’application. Après configuration, tous les membres du groupe ont accès au répertoire partagé sous Library/Application Support/ dans le conteneur.
Selon Apple WWDC 2020 Session 10026, App Group couvre trois scénarios clés : la synchronisation des paramètres via NSUserDefaults, le partage de fichiers via FileManager et Core Data partagé avec un seul magasin. Chaque scénario nécessite simplement de spécifier l’identifiant de groupe dans l’API correspondante.
iOS crée le conteneur partagé lors de la première exécution d’un processus avec le droit com.apple.security.application-groups. Physiquement, le conteneur se trouve dans un répertoire système — son chemin diffère du bac à sable de l’application principale et des extensions, mais tous les processus autorisés ont des permissions de lecture et d’écriture.
Apple garantit la sécurité d’App Group par la combinaison du team ID et de la signature de code. Un processus non signé avec le même certificat de développeur ne peut pas accéder au conteneur du groupe. Cela empêche les fuites de données entre les applications de différents développeurs.
Le format de l’identifiant est : group.<team-id>.<name>. Par exemple, group.ABC123DEFG.widget-data. Plusieurs groupes peuvent être créés sur un même appareil, chacun avec son propre ensemble de membres. Une seule application peut appartenir à plusieurs App Groups simultanément — cela est utile pour séparer les données de différentes extensions.
// Get the App Group container URL
guard let containerURL = FileManager.default
.containerURL(forSecurityApplicationGroupIdentifier: "group.com.example.widget")
else { return }
// Create a file in the shared container
let fileURL = containerURL.appendingPathComponent("shared.data")
try "Hello from main app".write(to: fileURL, atomically: true, encoding: .utf8)
FileManager fournit la méthode containerURL(forSecurityApplicationGroupIdentifier:) qui retourne l’URL du répertoire partagé. Il est important d’appeler cette méthode séparément dans chaque processus — le chemin est physiquement le même, mais chaque processus le voit à travers son propre prisme de sécurité.
L’activation d’App Group dans Xcode commence par les Capabilities — l’interrupteur App Groups ajoute le droit au projet. Apple Developer Portal exige également que l’identifiant de l’application inclue cette capacité. Sans cela, la signature de code ne fonctionnera pas sur un appareil réel.
Ouvrez votre projet dans Xcode, sélectionnez la cible de l’application et allez dans l’onglet Signing & Capabilities. Cliquez sur + et choisissez App Groups. Créez un nouveau groupe ou sélectionnez un groupe existant. Répétez les mêmes étapes pour chaque extension qui a besoin d’accéder au conteneur partagé. Tous les participants doivent utiliser le même identifiant de groupe.
Après avoir activé les Capabilities, Xcode crée automatiquement un fichier .entitlements avec la clé com.apple.security.application-groups et un tableau d’identifiants. Assurez-vous que toutes les extensions nécessaires ont ce fichier avec le bon team ID dans l’identifiant de groupe.
<!-- Example entitlements file -->
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.example.shared</string>
</array>
Si votre projet a plusieurs extensions (Today Widget, Share Extension, Notification Service), chacune doit avoir son propre fichier de droits avec le même groupe. L’absence de droits sur une cible est une raison courante pour laquelle une extension ne voit pas les données partagées.
La façon la plus simple de synchroniser les données entre une application et ses extensions est UserDefaults avec un suite name. Au lieu de UserDefaults.standard standard, vous créez une instance avec l’identifiant App Group, et tous les processus lisent les mêmes paramètres.
Selon les Apple Human Interface Guidelines, ce mécanisme convient pour synchroniser l’état : thème sélectionné, favoris, indicateurs d’intégration. Cependant, il n’est pas conçu pour de grands volumes de données ou des opérations d’écriture simultanées — pour cela, utilisez des fichiers ou Core Data.
// Write to UserDefaults App Group (main app)
let defaults = UserDefaults(suiteName: "group.com.example.shared")
defaults?.set(true, forKey: "isDarkMode")
defaults?.synchronize()
// Read from UserDefaults App Group (widget extension)
let sharedDefaults = UserDefaults(suiteName: "group.com.example.shared")
let isDark = sharedDefaults?.bool(forKey: "isDarkMode") ?? false
Remarque : l’instance UserDefaults avec suiteName est créée séparément dans chaque processus mais lit à partir du même fichier plist dans le conteneur partagé. La méthode synchronize() garantit une écriture immédiate sur le disque — dans iOS 13+, elle peut être omise car le système synchronise les données périodiquement.
Pour des scénarios plus complexes, App Group fournit un accès à un système de fichiers partagé. Tout fichier créé dans le répertoire du conteneur est accessible à tous les processus du groupe. Cela permet une base de données Core Data partagée, un cache d’images ou des fichiers temporaires.
Pour utiliser un magasin Core Data partagé, créez un NSPersistentContainer avec l’URL du fichier .sqlite situé dans le répertoire App Group. Assurez-vous qu’un seul processus écrit dans la base de données à la fois — l’écriture simultanée peut corrompre les données. Une architecture typique : l’application principale écrit, les extensions lisent.
// Setup Core Data with App Group container
lazy var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "SharedModel")
guard let appGroupURL = FileManager.default
.containerURL(forSecurityApplicationGroupIdentifier: "group.com.example.shared")
else { return container }
let storeURL = appGroupURL.appendingPathComponent("SharedModel.sqlite")
container.persistentStoreDescriptions = [NSPersistentStoreDescription(url: storeURL)]
container.loadPersistentStores { _, error in
if let error = error { fatalError(error.localizedDescription) }
}
return container
}()
Une approche alternative est un cache d’images basé sur des fichiers. NSCache vit uniquement en mémoire, mais via App Group, vous pouvez enregistrer les images mises en cache sur le disque dans le répertoire partagé. L’extension widget peut accéder aux mêmes fichiers et afficher des données à jour sans téléchargements réseau supplémentaires.
| Scénario | API recommandée | Taille des données |
|---|---|---|
| Paramètres et indicateurs | UserDefaults suiteName | jusqu’à 1 Ko |
| Cache d’images | FileManager + NSCache | jusqu’à 100 Mo |
| Données structurées | Magasin Core Data | jusqu’à 500 Mo |
| Fichiers temporaires | FileManager temporaire | jusqu’à 50 Mo |
Lorsque vous travaillez avec des fichiers partagés, gardez à l’esprit que le système peut terminer l’extension à tout moment. Utilisez NSFileCoordinator pour coordonner l’accès et éviter la corruption des données lorsque plusieurs processus écrivent simultanément.
Questions fréquentes
App Group est un mécanisme iOS qui crée un conteneur partagé pour stocker des données entre une application et ses extensions. Il permet aux processus avec le même identifiant de groupe d’échanger des fichiers, des paramètres UserDefaults et des données Core Data via un seul répertoire sur le système de fichiers.
Ouvrez les Capabilities de la cible dans Xcode, activez App Groups et ajoutez un identifiant au format group.*. Répétez ensuite les mêmes étapes pour chaque extension qui a besoin d’accéder au conteneur partagé. Assurez-vous que tous les participants utilisent le même identifiant de groupe.
Tous les types d’extensions iOS prennent en charge App Group : Today Widget (extension widget), Share Extension, Notification Service Extension, Custom Keyboard et autres. Chaque extension doit avoir un fichier de droits séparé avec le même identifiant de groupe que l’application principale.
Oui, mais uniquement si les applications sont signées avec le même certificat de développeur et ont le même team ID. Apple garantit la sécurité via la signature de code : deux applications de développeurs différents ne peuvent pas accéder au même conteneur même avec un identifiant de groupe identique.
Utilisez UserDefaults avec suite name pour les petits paramètres, FileManager pour les fichiers et Core Data pour les données structurées. Toutes ces API fonctionnent avec le répertoire App Group — il suffit de spécifier l’identifiant de groupe lors de l’initialisation. Pour Core Data, assurez-vous que l’URL du magasin pointe vers le répertoire partagé.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi