App Group es un mecanismo de iOS que crea un contenedor compartido para el intercambio de datos entre una aplicación y sus extensiones. Sin él, cada proceso (aplicación principal, widget, share extension) funciona en un entorno aislado y no tiene acceso a los datos de un componente vecino. Según Apple Developer Documentation, 2026, App Group resuelve este problema mediante un identificador de grupo único especificado en los entitlements. Es una herramienta fundamental para crear una experiencia de usuario consistente en el ecosistema iOS.
Puntos clave
App Group es un mecanismo del sistema operativo iOS que proporciona un área de almacenamiento compartida para múltiples procesos del mismo desarrollador. Sin él, cada extensión funciona en su propia zona aislada y no puede leer los datos escritos por otro componente. App Group resuelve este aislamiento creando un directorio en el sistema de archivos accesible para todos los procesos con los entitlements correctos.
El identificador de grupo comienza con el prefijo group. y se especifica en el archivo de entitlements del proyecto. En Xcode, este identificador se agrega a través de Capabilities — el sistema lo incluye automáticamente en la firma de la aplicación. Una vez configurado, todos los miembros del grupo obtienen acceso al directorio compartido en Library/Application Support/ dentro del contenedor.
Según Apple WWDC 2020 Session 10026, App Group cubre tres escenarios clave: sincronización de configuraciones mediante NSUserDefaults, uso compartido de archivos mediante FileManager y Core Data compartido con un único almacén. Cada escenario solo requiere especificar el identificador de grupo en la API correspondiente.
iOS crea el contenedor compartido la primera vez que se ejecuta cualquier proceso con el entitlement com.apple.security.application-groups. Físicamente, el contenedor se encuentra en un directorio del sistema — su ruta difiere del sandbox de la aplicación principal y las extensiones, pero todos los procesos autorizados tienen permisos de lectura y escritura.
Apple garantiza la seguridad de App Group mediante la combinación del team ID y la firma de código. Un proceso que no esté firmado con el mismo certificado de desarrollador no puede acceder al contenedor del grupo. Esto evita fugas de datos entre aplicaciones de diferentes desarrolladores.
El formato del identificador es: group.<team-id>.<name>. Por ejemplo, group.ABC123DEFG.widget-data. Se pueden crear múltiples grupos en un dispositivo, cada uno con su propio conjunto de miembros. Una sola aplicación puede pertenecer a varios App Groups simultáneamente — esto es útil para separar datos de diferentes extensiones.
// 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 proporciona el método containerURL(forSecurityApplicationGroupIdentifier:), que devuelve la URL del directorio compartido. Es importante llamar a este método por separado en cada proceso — la ruta es físicamente la misma, pero cada proceso la ve a través de su propio prisma de seguridad.
Habilitar App Group en Xcode comienza con las Capabilities — el interruptor de App Groups agrega el entitlement al proyecto. Apple Developer Portal también requiere que el identificador de la aplicación incluya esta capability. Sin ella, la firma de código no funcionará en un dispositivo real.
Abra su proyecto en Xcode, seleccione el target de la aplicación y vaya a la pestaña Signing & Capabilities. Haga clic en + y elija App Groups. Cree o seleccione un grupo existente. Repita los mismos pasos para cada extensión que necesite acceso al contenedor compartido. Todos los participantes deben usar el mismo identificador de grupo.
Después de habilitar Capabilities, Xcode crea automáticamente un archivo .entitlements con la clave com.apple.security.application-groups y un array de identificadores. Asegúrese de que todas las extensiones necesarias tengan este archivo con el team ID correcto en el identificador de grupo.
<!-- Example entitlements file -->
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.example.shared</string>
</array>
Si su proyecto tiene varias extensiones (Today Widget, Share Extension, Notification Service), cada una debe tener su propio archivo de entitlements con el mismo grupo. La ausencia de entitlements en cualquier target es una razón común por la que una extensión no puede ver los datos compartidos.
La forma más sencilla de sincronizar datos entre una aplicación y sus extensiones es UserDefaults con un suite name. En lugar del UserDefaults.standard estándar, crea una instancia con el identificador de App Group, y todos los procesos leen la misma configuración.
Según las Apple Human Interface Guidelines, este mecanismo es adecuado para sincronizar el estado: tema seleccionado, favoritos, indicadores de incorporación. Sin embargo, no está diseñado para grandes volúmenes de datos u operaciones de escritura concurrentes — para eso use archivos o 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
Tenga en cuenta: la instancia de UserDefaults con suiteName se crea por separado en cada proceso pero lee del mismo archivo plist en el contenedor compartido. El método synchronize() garantiza la escritura inmediata en disco — en iOS 13+ se puede omitir ya que el sistema sincroniza los datos periódicamente.
Para escenarios más complejos, App Group proporciona acceso a un sistema de archivos compartido. Cualquier archivo creado en el directorio del contenedor es accesible para todos los procesos del grupo. Esto permite una base de datos Core Data compartida, caché de imágenes o archivos temporales.
Para usar un almacén de Core Data compartido, cree un NSPersistentContainer con la URL del archivo .sqlite ubicado en el directorio de App Group. Asegúrese de que solo un proceso escriba en la base de datos a la vez — la escritura concurrente puede dañar los datos. Una arquitectura típica: la aplicación principal escribe, las extensiones leen.
// 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
}()
Un enfoque alternativo es un caché de imágenes basado en archivos. NSCache vive solo en memoria, pero a través de App Group puede guardar imágenes en caché en el disco en el directorio compartido. La extensión del widget accede a los mismos archivos y muestra datos actualizados sin descargas adicionales de red.
| Escenario | API recomendada | Tamaño de datos |
|---|---|---|
| Configuraciones y banderas | UserDefaults suiteName | hasta 1 KB |
| Caché de imágenes | FileManager + NSCache | hasta 100 MB |
| Datos estructurados | Core Data store | hasta 500 MB |
| Archivos temporales | FileManager temporal | hasta 50 MB |
Al trabajar con archivos compartidos, tenga en cuenta que el sistema puede finalizar la extensión en cualquier momento. Use NSFileCoordinator para coordinar el acceso y evitar la corrupción de datos cuando varios procesos escriben simultáneamente.
Preguntas frecuentes
App Group es un mecanismo de iOS que crea un contenedor compartido para almacenar datos entre una aplicación y sus extensiones. Permite que los procesos con el mismo identificador de grupo intercambien archivos, configuraciones de UserDefaults y datos de Core Data a través de un único directorio en el sistema de archivos.
Abra las Capabilities del target en Xcode, active App Groups y agregue un identificador en el formato group.*. Luego repita los mismos pasos para cada extensión que necesite acceso al contenedor compartido. Asegúrese de que todos los participantes usen el mismo identificador de grupo.
Todos los tipos de extensiones de iOS admiten App Group: Today Widget (widget extension), Share Extension, Notification Service Extension, Custom Keyboard y otras. Cada extensión debe tener un archivo de entitlements separado con el mismo identificador de grupo que la aplicación principal.
Sí, pero solo si las aplicaciones están firmadas con el mismo certificado de desarrollador y tienen el mismo team ID. Apple garantiza la seguridad mediante la firma de código: dos aplicaciones de diferentes desarrolladores no pueden acceder al mismo contenedor incluso con un identificador de grupo idéntico.
Use UserDefaults con suite name para configuraciones pequeñas, FileManager para archivos y Core Data para datos estructurados. Todas estas API funcionan con el directorio de App Group — solo especifique el identificador de grupo durante la inicialización. Para Core Data, asegúrese de que la URL del almacén apunte al directorio compartido.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también